DarkFlame / blog

blog for me
2 stars 0 forks source link

一些不常见,但很有用的git使用skill #5

Open DarkFlame opened 6 years ago

DarkFlame commented 6 years ago

一些不常见,但很有用的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重新获取改动的新代码

方法

git stash save <message> //保存搁置
git stash list //已经保存的搁置list
git stash apply 或 git stash apply stash@{1} //恢复搁置指定的搁置
git stash clear //清空搁置

7. 查找消失的 commit ,撤销本地修改之后再恢复

场景

你提交了几个 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 -- 撤销时文件修改

8 git rebase 进行commit历史记录的修改(未push)

方法

git rebase <base>//base 这里可以是任何类型的提交引用(ID、分支名、标签,或是 HEAD 的相对引用)。
git rebase -i <start-SHA-id>^..<end-SHA-id> //交互式界面的rebase

说明

rebase 是将上游更改合并进本地仓库的通常方法。你每次想查看上游进展时,用 git merge 拉取上游 更新会导致一个多余的合并提交。在另一方面,rebase 就好像是说「我想将我的更改建立在其他人的进展之上」。

你永远不应该 rebase 那些已经推送到公共仓库的提交更多请点击这里

DarkFlame commented 6 years ago

更多点击这里