【GIT】GIT使用中的一些实用技巧
HEAD
HEAD~~ 或 HEAD~2 前两次修改
改写最后一次提交 commit --amend
有时难免粗心大意,commit后,又发现代码中又一些小问题,我们可以通过 –amend 选项将 最后一次提交的内容给修改掉!
$ git add .
$ git commit --amend
问题:
那么,如果我已经提交了MR,在MR的submit界面上,是如何体现这次修改的呢?
回退代码 revert 和 reset
revert 是取消过去的提交,执行 revert 命令后, 会生成一个Revert xxx 内容的提交
reset 是遗弃提交,所以它不会生成一次新的提交
reset 有三种模式,可以根据情况使用:
模式 | HEAD 的位置 | 索引 | 工作树 |
---|---|---|---|
soft | 修改 | 不修改 | 不修改 |
mixed | 修改 | 修改 | 不修改 |
hard | 修改 | 修改 | 修改 |
如果 reset 错了,可以通过
git reset --hard ORIG_HEAD
还原到 reset 前的状态。
问题一:
我可以指定revert任意一次提交吗?revert的内容是仅那次提交的修改,还是那次提交之后所有的修改?
问题二:
soft 和 mixed 用法示例,场景
问题三:
对于已经发布的提交,reset后是如何在MR中体现的?
提取提交 cherry-pick
如果我代码的修改上错了分支,或者想将分支的修改导入到另一个分支,可以使用 cherry-pick
比如我想将某个分支上的 提交 1111 导入到 master
git checkout master
git cherry-pick 1111
git add
git commit
问题:
只能导入那一次提交的内容吗?
比如 master 上有一次提交了,fix 分支上有两次提交,cherry-pick fix上的第二次提交,那么fix上的第一次提交,没有的 ?
合并分支 merge 和 rebase
merge 和 rebase 都可以合并分支的代码,主要差异在于合并后的历史纪录
个人比较喜欢 rebase ,生成的历史纪录更简洁易懂
比如说有两个分支 master 和 fix
merge fix 和 master 两个分支的修改会生成一个提交,保持了修改内容的纪录,但是修改纪录很复杂
git checkout master
git merge fix
解决冲突
git commit . -m "合并fix分支到master"
rebase fix 分支的修改会添加在 master 后面,这样可能会有冲突,但处理之后,历史纪录是一条直线,非常好懂
git checkout fix
git rebase master
解决冲突
rebase 的时候,修改冲突后的提交不是使用 commit 命令,而是执行 rebase --continue。若要取消 rebase,指定 --abort。
git add .
git rebase --continue
这个时候, master 的最后一次修改后面,又追加了 fix 的修改,
然后切换到 master 分支后合并,将 master 分支的 HEAD 挪到后面加入的 fix 的修改
git checkout master
git merge issue3
建议:
在 master 分支中更新 fix 分支的代码,使用 rebase
在 fix 分支中导入 master 分支的修改,先使用rebase,再使用 merge
问题:
没看懂建议…
我只想看看远端的代码长什么样子了 fetch
执行 pull,远程数据库的内容就会自动合并。但是,有时只是想确认本地数据库的内容而不想合并。这种情况下,请使用 fetch。
执行 fetch 就可以取得远程数据库的最新历史记录。取得的提交会导入到没有名字的分支,这个分支可以从名为 FETCH_HEAD 的退出。
汇合提交 rebase -i
比如说
git rebase -i HEAD~~
然后会打开一个文本编辑器,会显示 HEAD 到 HEAD~~ 的提交
将 HEAD commit 前面的 pick 改成 squash
保存退出
然后会自动合并后提交,接着会显示提交信息的编辑器,编辑信息后保存退出
这样两个提交就汇合成一个提交了
修改提交 rebase -i
前面的 commit --amend 只能修改最后一次提交,但是使用 rebase -i 我们可以修改任意一次提交!
首先选择要修改的提交,比如前两次的提交
git rebase -i HEAD~~
然后将第一行的 pick 改成 eidt,保存退出
这个时候修改过的提交会呈现退出状态
然后打开要修改的文件,编辑
再用
git add .
git commit --amend
保存修改
要改的提交都改完了的话,执行
git rebase --continue
这个时候很可能出现冲突,需要修改冲突后再执行 add 和 rebase --continue
如果想要还原到 rebase 之前的状态
git reset --hard ORIG_HEAD
汇合分支的提交然后合并到指定分支
git checkout master
git merge --squash fix
修改冲突
git commit . -m "合并fix分支上的所有提交到master分支"
参考:
https://backlog.com/git-tutorial/cn/reference/
https://blog.csdn.net/qq_32452623/article/details/79599503