Open DarkFlame opened 6 years ago
对于git的使用,相信任何程序员都不会陌生,不过大部分人可能在开发过程中使用的也就 git add ,git commit, git pull, git push, git merge,git checkout等 常用命令。
场景
你所提交的commit已经被push,你发现有问题,需要撤销这个commit
方法
git revert <SHA>
说明
git revert 会生成一个新的 commit ,这个新 commit 会对你选择的 commit 里的 操作完全相反,任何从原先的 commit 里删除的内容会在新的 commit 里被加回去, 任何在原先的 commit 里加入的内容会在新的 commit 里被删除。
git commit --amend 或 git commit --amend -m "message"
it commit --amend 会用一个新的 commit 更新并替换最近的 commit , 这个新的 commit 会把当前的任何修改内容和上一个 commit 的内容结合起来。
git checkout <SHA> -- <filename>
git checkout 会把工作目录里的文件修改到 Git 之前记录的某个状态, 如果SHA缺省,则默认是当前的HEAD,即最近一次的提交(最近几次提交可以用HEAD~1,HEAD~2表示)
git reset --mixed/hard/soft <SHA>
git reset 会把你的代码库重置到指定的 SHA 那个commit的状态,在指定的commit之后的 commit 在提交历史中都会消失(代码并不会消失)。 缺省情况下是--mixed,指定的commit 之后所有的代码都会出现在工作区,可以通过git add 和 git commit 来重新提交 --soft 则是指定的commit 之后的代码默认git add 到暂存区,直接通过git commit就可以提交 --hard 则是会让指定的commit之后的代码完全消失在工作区(谨慎使用)
有时候我们只想合并别的分支上的某一次或几次提交,而不是整条分支的代码
git cherry-pick <SHA> 或 git cherry-pick <start-SHA-id>..<end-SHA-id>//左开右闭
有时花了几天时间一直在做一个新功能,已经改了差不多十几个文件,突然有一个bug需要紧急解决, 此时就需要用到git stash 把暂存区(先git add)的内容单独保存到一个地方,恢复工作区, 等修复好bug,commit了之后,在利用git stash apply重新获取改动的新代码
git stash save <message> //保存搁置 git stash list //已经保存的搁置list git stash apply 或 git stash apply stash@{1} //恢复搁置指定的搁置 git stash clear //清空搁置
你提交了几个 commit,然后用 git reset --hard 撤销了这些修改, 接着你又意识到:你希望还原这些操作!
git --reflog git checkout git reset
你可以恢复几乎任何东西任何你 commit 过的东西只要通过 reflog git reflog会记录每次commit,类似与 git log 不过只要HEAD发生改变(git checkout 或 git commit ,git revert, git reset,git rebase 等都会影响),就会被记录,如下
400e4b7 HEAD@{0}: checkout: moving from master to HEAD~2 0e25143 HEAD@{1}: commit (amend): 将一些很赞的新特性引入`master` 00f5425 HEAD@{2}: commit (merge): 合并'feature'分支 ad8621a HEAD@{3}: commit: 结束feature分支开发
此时你就可以通过git checkout来恢复某个文件,或者git reset来恢复到某次版本, 不过不能恢复通过git checkout -- 撤销时文件修改
git rebase <base>//base 这里可以是任何类型的提交引用(ID、分支名、标签,或是 HEAD 的相对引用)。 git rebase -i <start-SHA-id>^..<end-SHA-id> //交互式界面的rebase
rebase 是将上游更改合并进本地仓库的通常方法。你每次想查看上游进展时,用 git merge 拉取上游 更新会导致一个多余的合并提交。在另一方面,rebase 就好像是说「我想将我的更改建立在其他人的进展之上」。
你永远不应该 rebase 那些已经推送到公共仓库的提交更多请点击这里
更多点击这里
一些不常见,但很有用的git使用skill
对于git的使用,相信任何程序员都不会陌生,不过大部分人可能在开发过程中使用的也就 git add ,git commit, git pull, git push, git merge,git checkout等 常用命令。
1. 撤销一个已经 push 的commit
场景
你所提交的commit已经被push,你发现有问题,需要撤销这个commit
方法
git revert <SHA>
说明
git revert 会生成一个新的 commit ,这个新 commit 会对你选择的 commit 里的 操作完全相反,任何从原先的 commit 里删除的内容会在新的 commit 里被加回去, 任何在原先的 commit 里加入的内容会在新的 commit 里被删除。
2. 修复最近一个commit的消息,或者把新的提交合并到最近的一个commit中
方法
git commit --amend 或 git commit --amend -m "message"
说明
it commit --amend 会用一个新的 commit 更新并替换最近的 commit , 这个新的 commit 会把当前的任何修改内容和上一个 commit 的内容结合起来。
3. 撤销本地文件的修改, 或者把文件恢复到某个版本
方法
git checkout <SHA> -- <filename>
说明
git checkout 会把工作目录里的文件修改到 Git 之前记录的某个状态, 如果SHA缺省,则默认是当前的HEAD,即最近一次的提交(最近几次提交可以用HEAD~1,HEAD~2表示)
4. reset 重置代码到某一个版本
方法
git reset --mixed/hard/soft <SHA>
说明
git reset 会把你的代码库重置到指定的 SHA 那个commit的状态,在指定的commit之后的 commit 在提交历史中都会消失(代码并不会消失)。 缺省情况下是--mixed,指定的commit 之后所有的代码都会出现在工作区,可以通过git add 和 git commit 来重新提交 --soft 则是指定的commit 之后的代码默认git add 到暂存区,直接通过git commit就可以提交 --hard 则是会让指定的commit之后的代码完全消失在工作区(谨慎使用)
5. 合并某一次或几次的commit,而不是整条分支
场景
有时候我们只想合并别的分支上的某一次或几次提交,而不是整条分支的代码
方法
git cherry-pick <SHA> 或 git cherry-pick <start-SHA-id>..<end-SHA-id>//左开右闭
6. git stash 把暂存区的内容保存到一个地方,并把工作目录恢复到最近一次commit状态
场景
有时花了几天时间一直在做一个新功能,已经改了差不多十几个文件,突然有一个bug需要紧急解决, 此时就需要用到git stash 把暂存区(先git add)的内容单独保存到一个地方,恢复工作区, 等修复好bug,commit了之后,在利用git stash apply重新获取改动的新代码
方法
7. 查找消失的 commit ,撤销本地修改之后再恢复
场景
你提交了几个 commit,然后用 git reset --hard 撤销了这些修改, 接着你又意识到:你希望还原这些操作!
方法
说明
你可以恢复几乎任何东西任何你 commit 过的东西只要通过 reflog git reflog会记录每次commit,类似与 git log 不过只要HEAD发生改变(git checkout 或 git commit ,git revert, git reset,git rebase 等都会影响),就会被记录,如下
此时你就可以通过git checkout来恢复某个文件,或者git reset来恢复到某次版本, 不过不能恢复通过git checkout -- 撤销时文件修改
8 git rebase 进行commit历史记录的修改(未push)
方法
说明
rebase 是将上游更改合并进本地仓库的通常方法。你每次想查看上游进展时,用 git merge 拉取上游 更新会导致一个多余的合并提交。在另一方面,rebase 就好像是说「我想将我的更改建立在其他人的进展之上」。
你永远不应该 rebase 那些已经推送到公共仓库的提交更多请点击这里