개발자로서 git
을 모르거나 아직 git
을 사용하지 못한다면 반성해볼 필요가 있습니다. 가서 소개 소개를 직접 읽어보세요. 오늘은 제가 일상생활에서 자주 사용하는 git
명령어와 사무실 효율을 높일 수 있고 좋다고 생각하는 명령어를 소개하겠습니다. 내용이 좀 난잡할 수도 있지만 확실히 고전적인 명령들이네요. 여기에 메모해 두었는데, 저를 감상하러 오시는 분들께 도움이 되었으면 좋겠습니다.
그 전에 git
워킹디렉토리(working Directory)
명령어부터 시작해 볼까요. clone
원격 저장소를 로컬로 가져오는 명령입니다. 하지만 지정된 폴더로 가져오고 싶을 때는 직접 git
할 수 있습니다. 실제로는 이렇게 할 필요가 없으며, 하나의 명령으로 git colne
하면 됩니다. 매우 간단합니다. mkdir
git clone 远程仓库 文件名
rm
git rm --cached <file>
git add .
stash을 사용하여 작업공간에 모든 파일을 저장할 수 있습니다. 이때 안전하게 브랜치를 잘라내고 복구bug
하면 됩니다. 복구가 완료된 후 git stash
를 실행하여 이전에 저장된 것을 꺼내면 됩니다. 물론 bug
과 같은 다른 관련 명령도 있습니다. 저장된 기록을 확인하고, git stash pop
저장된 기록을 삭제하세요. git stash list
git stash drop
태그
아아아git tag tagName
수정
에 파일이 추가되지 않았거나 일부 파일이 수정된 것을 발견했습니다. 지금은 새로운 commit
정보를 추가하지 않고 마지막 commit
에 추가하기만 하면 됩니다. 이때 commit
git push --tags tagName
commit
를 이용하여 임시저장영역에 파일을 추가할 수 있으며, 이때 정보를 수정할 수도 있습니다. commit
reset
의 효과를 얻을 수 있지만 다음 명령을 사용하여 이전 reset
git commit --amend <file>
rm
명령을 바꿀 수 있습니다. git rm --cached <file>
매개변수와 결합하면 어떤 노드로든 후퇴하여 작업할 수 있습니다. reset
git reset HEAD <file>
soft
이 명령을 실행한 후에는 commit
으로 돌아갑니다. .작업공간은 그대로 유지되며 임시저장공간은 당시의 장소로 복원됩니다. 매개변수도 있습니다. index
rreeindex
는 hard
의 반대라고 할 수 있는데, 그 효과는 작업 영역과 임시 보관 영역의 차이에 있습니다.
rebasesoft
제출하기 전에 먼저 원격 rebase
정보를 로컬 정보로 가져와야 합니다. 이 경우 commit
명령을 사용할 수 있습니다. 아래와 같이 현재 push
브랜치 commit
rebase
develop
에서 명령
git reset --soft index
를 먼저 실행한 후 rebase
로 이동해야 합니다. the Remote
git reset --hard index
push
각 지점의 최종 상황은 위 사진과 같습니다. 명령어가 기억하기 어렵다면 하나의 명령어를 사용하여 위의 효과를 얻을 수도 있습니다. master
git fetch git rebase origin/master
의 간단한 응용이자 일반적인 명령어이기도 합니다. 다음은
의 선택적 매개변수를 소개합니다. rebase
rebase
--onto--onto
브랜치에 잘못된 A
이 있는 것을 발견했습니다. B
을 commit
에 추가하려면 이 잘못된 역시 우수해요. A
당신의 마법의 힘을 뽐낼 시간입니다. commit
当前处在B
分支,要得到上面的结果,只需执行如下命令
git rebase --onto master <b的commit hash code> B
这个不仅可以针对不同的分支,也能作用于同一个分支上。所以针对上面的情况可以只对分支B
进行操作,等价命令如下:
git rebase --onto <a的commit hash code> <b的commit hash code> B
当我们要修改commit
信息的名称时,如果要修改的commit
处在第一个时,可以使用
git commit --amend
如果不是第一个时,我们就要使用到rebase
的--interactive
可选参数了,可以简写为-i
。
git rebase -i <commit hash code>
参数后面的commit hash code
为需要修改的commit
的前一个。执行之后就会出现如下类似的信息:
pick 137cf0a First coommit pick 163dc38 Second commit # Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
根据提示我们可以有6
个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit
的情况,需要使用r
。
r 137cf0a First commit pick 163dc38 Second commit
执行之后会跳到修该First coomit
的界面,进行修改即可。
First commit # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Thu Jan 26 23:07:10 2017 +0800 # # rebase in progress; onto f9aee6e # You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'. # # Changes to be committed: # new file: file1
至于其他的操作项,有兴趣的可以自己去尝试一下。例如s
操作就可以用来合并commit
。
相信branch
都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit
信息节点进行创建分支。
要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit
节点的hash code
git branch new_branch <commit hash code>
这里提一下push
的--set-upstream
,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。
git checkout push_branch git push origin push_branch
下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。
git push --set-upstream origin push_branch
这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit
你还是想推送到远程master
上。
将分支切换到master
,执行以下命令:
git cherry-pick <b的 commit hash code>
我们所熟知的是使用merge
来进行分支的合并,每次使用merge
时都会自动将副分支合并成一个commit
进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash
操作
git merge --squash dev_branch
执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。
当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:
git reflog
894a16d HEAD@{0}: commit: commit another todo 6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman 324336a HEAD@{2}: commit: commit todo 6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger 6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom 6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman 6876e5b HEAD@{6}: commit (initial): initial commit
这样我们就可以看到所用的操作历史了。这样如果我们使用git reset
命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code
,之后就可以通过如下命令进行恢复。
git checkout <hash code>
目前想到的就这些了,希望能有所帮助
个人博客:http://www.php.cn/
作为一个开发者,如果现在还不知道git
或者还不会使用git
,那么你应该好好的反省。自己去好好看一遍的入门介绍吧。今天只是对自己在日常中使用git
的一些常用命令的介绍与自己认为不错且能提高我们办公效率的命令。内容可能会有点杂乱,但绝对都是经典的命令,在此记下笔记,也希望能帮助来赏脸关顾的你们。
在这之前,来介绍一下git
的三个区域
工作区(working directory)
暂存区(stage index)
本地历史区(history)
通过一张图就能简洁易懂的明白它们之间的转化。
은 clone
명령으로 먼저 소개됩니다. git
를 사용해본 사람이라면 알 것입니다. git colne
원격 저장소를 로컬로 가져오는 명령입니다. 하지만 지정된 폴더로 가져오고 싶을 때는 직접 mkdir
할 수 있습니다. 실제로는 이렇게 할 필요가 없으며, 하나의 명령으로 git clone 远程仓库 文件名
하면 됩니다. 매우 간단합니다.
작업 중 이런 상황이 발생할 수 있습니다. git add .
을 사용하여 작업 공간의 모든 수정된 파일을 임시 저장 영역에 직접 추가하지만 나중에는 Do가 있다는 것을 알게 됩니다. 먼저 파일을 추가하지 말고 다음 명령을 사용하여 파일을 작업 공간으로 되돌릴 수 있습니다.
git rm --cached <file>
개발 중 온라인 긴급bug
이 발생하여 수정이 필요한 상황이 있는데, 현재 개발 중인 기능이 완료되지 않은 상황이고, 제출하고 싶지 않다면 이 시점에서 git stash
을 사용하여 작업공간에 모든 파일을 저장할 수 있습니다. 이때 안전하게 브랜치를 잘라내고 복구bug
하면 됩니다. 복구가 완료된 후 git stash pop
를 실행하여 이전에 저장된 것을 꺼내면 됩니다. 물론 git stash list
과 같은 다른 관련 명령도 있습니다. 저장된 기록을 확인하고, git stash drop
저장된 기록을 삭제하세요.
개발 중에 git tag tagName
태그를 지정하고 해당 태그를 원격 창고에 푸시해야 할 수도 있습니다. 이 경우 다음 명령을 사용하여 푸시할 수 있습니다.
나중에commit
보면 마지막 commit
에 파일이 추가되지 않았거나 일부 파일이 수정된 것을 발견했습니다. 지금은 새로운 commit
정보를 추가하지 않고 마지막 commit
에 추가하기만 하면 됩니다. 이때
git push --tags tagName
를 이용하여 임시저장영역에 파일을 추가할 수 있으며, 이때 commit
정보를 수정할 수도 있습니다.
reset
도 이전 rm
의 효과를 얻을 수 있지만 다음 명령을 사용하여 이전 git rm --cached <file>
git commit --amend <file>
reset
매개변수와 결합하면 어떤 soft
노드로든 후퇴하여 작업할 수 있습니다. commit
git reset HEAD <file>
으로 돌아갑니다. .작업공간은 그대로 유지되며 임시저장공간은 당시의 index
장소로 복원됩니다. index
매개변수도 있습니다. hard
rree
의 반대라고 할 수 있는데, 그 효과는 작업 영역과 임시 보관 영역의 차이에 있습니다. soft
는 리디렉션을 의미합니다. 현재 브랜치와 원격 브랜치rebase
의 정보에 차이가 있는 경우 지금은 진행할 수 없음을 알려드립니다. commit
제출하기 전에 먼저 원격 push
정보를 로컬 정보로 가져와야 합니다. 이 경우 commit
명령을 사용할 수 있습니다. 아래와 같이 현재 rebase
브랜치 develop
명령 rebase
git reset --soft index
로 이동해야 합니다. the Remote push
master
git reset --hard index
git fetch git rebase origin/master
의 간단한 응용이자 일반적인 명령어이기도 합니다. 다음은 rebase
의 선택적 매개변수 rebase
를 소개합니다. --onto
브랜치에 새 브랜치를 생성할 때 다양한 기능을 개발하기 위해 다양한 브랜치를 생성합니다. 함수 및 일부 A
도 제출했는데, 현재 원래 B
브랜치에 잘못된 commit
이 있는 것을 발견했습니다. A
을 commit
에 추가하려면 이 잘못된 역시 우수해요. rebase
당신의 마법의 힘을 뽐낼 시간입니다. master
commit
--onto
은 현재 브랜치에 있습니다. 위의 결과를 얻으려면 다음 명령을 실행하세요.
git push origin master
이는 다른 브랜치를 대상으로 할 수 있을 뿐만 아니라 또한 동일한 지점에서 작업할 수도 있습니다. 따라서 위의 상황에서는 B
브랜치에서만 작업이 가능합니다.
git pull --rebase origin master
--interactiveB
git rebase --onto master <b的commit hash code> B
commit
를 사용할 수 있습니다. 첫 번째가 아닌 경우 commit
의 선택적 매개변수를 사용해야 합니다. 🎜>, 줄여서 로 쓸 수 있습니다.
git rebase --onto <a的commit hash code> <b的commit hash code> B
rebase
매개변수 뒤의 --interactive
는 수정이 필요한 -i
앞의 매개변수입니다. 실행 후 다음과 유사한 메시지가 나타납니다. pick 137cf0a First coommit pick 163dc38 Second commit # Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
根据提示我们可以有6
个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit
的情况,需要使用r
。
r 137cf0a First commit pick 163dc38 Second commit
执行之后会跳到修该First coomit
的界面,进行修改即可。
First commit # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Thu Jan 26 23:07:10 2017 +0800 # # rebase in progress; onto f9aee6e # You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'. # # Changes to be committed: # new file: file1
至于其他的操作项,有兴趣的可以自己去尝试一下。例如s
操作就可以用来合并commit
。
相信branch
都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit
信息节点进行创建分支。
要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit
节点的hash code
git branch new_branch <commit hash code>
这里提一下push
的--set-upstream
,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。
git checkout push_branch git push origin push_branch
下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。
git push --set-upstream origin push_branch
这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit
你还是想推送到远程master
上。
将分支切换到master
,执行以下命令:
git cherry-pick <b的 commit hash code>
我们所熟知的是使用merge
来进行分支的合并,每次使用merge
时都会自动将副分支合并成一个commit
进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash
操作
git merge --squash dev_branch
执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。
当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:
git reflog
894a16d HEAD@{0}: commit: commit another todo 6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman 324336a HEAD@{2}: commit: commit todo 6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger 6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom 6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman 6876e5b HEAD@{6}: commit (initial): initial commit
这样我们就可以看到所用的操作历史了。这样如果我们使用git reset
命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code
,之后就可以通过如下命令进行恢复。
git checkout <hash code>
目前想到的就这些了,希望能有所帮助
更多git使用杂记 相关文章请关注PHP中文网!