不再害怕push和merge
本文翻译自https://github.com/k88hudson/git-flight-rules,该文章收录了若干git常见错误操作,以及解决方法。
什么是”飞行手册”?
一个关于出现问题如何去解决的的git程序员指南
(以前是宇航员指南)
“飞行手册”是一个构建起来十分困难的知识体系,它会十分详细地记录发送某事件的原因,以及为什么。它基本是非常详细,非常适应特定场景的标准操作步骤。
自20世纪60年代初以来,美国宇航局一直在几率我们的失误,灾难和解决方案,当时水星时代的地面小组首先开始将“经验教训”收集到一个纲要中,该纲要现列出成千上万有问题的情况,从发动机故障到打嗝的手柄到计算机故障,及其解决方案。
— 克里斯·哈德菲尔德,宇航员的生命指南。
文档约定
为了清楚起见,本文档使用的都是自定义的bash提示符来指明当前分支
和是否有暂存区的变动
,具体分支包含在括号中,分支名旁边的*
指出变动已提交到暂存区
。
译者注:关键性名词 推送–push ,提交–commit,暂存区–stage , 拉取–pull
编辑提交的时候(Commit)
我刚才提交了什么?
比如说,你只是盲目地提交了变动(commit the changes),通常有些时候为了省事会git add .
和git commit -m '*'
提交当前的所有改变,但你不确定刚刚提交的具体内容是什么,你可以在当前HEAD上显示最新提交的:
|
|
或者
|
|
我在commit message 里面写了错误的文字信息
如果你写错了,提交还没有被推送,你可以执行以下操作来改变提交信息:
|
|
这将打开一个默认文本编辑器,用于编辑信息。或者,你可以用一个命令来完成这一切。
|
|
如果你已经将本次更新推送到了远程,虽然可以修改提交并强制推送,但不建议这样做。
我用错误的用户名和邮箱commit
如果它是一个单一的提交,修改它
|
|
如果您需要更改所有历史记录,请参阅“git filter-branch”的手册页。
我想要从commit了的文件中将一个文件重置成上一个版本号的内容
|
|
译者注:这三行命令会将myfile文件重置到上一个版本号然后再次一并提交。
我想撤销或删除我最近一次提交
如果你需要删除已经推送过的提交,可以使用如下的方式。但是,这将不可逆转地改变你的提交历史,并且将别人的提交记录都弄糟(因为强制性覆盖)。总之,如果你不确定你的目的,千万别这样做。
|
|
如果你还没有推送,把Git重置到上一次提交前的状态。(并且保持你暂存区里的状态)
sh (my-branch*)$ git reset --soft HEAD@{1}
本方法只适用于仍未push的情况,如果你已经push了,唯一安全的做法就是git revert SHAofBadCommit
。这将会创建一次新的提交,用于撤销之前所有的更改。如果该分支基本安全(没有其他开发人员负责),直接git push -f
也可以。
译者注:
reset
和revert
的区别在于:git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
删除任意的一次提交
同样警告,如果不是必要,千万别这么做
|
|
通过交互式工具进行控制和修改是一个可取的方式。
我尝试把我的修改提交到远程,但是我却收到一条错误信息
|
|
注意,与rebasing
(参见下文)一样,本次修改将会用新的commit记录替代旧的记录,所以你必须强制push(–force-with-lease),当你使用下面的命令的时候一定要指定具体分支
|
|
译者注:
不了解–force-with-lease请参考http://www.dingxuewen.com/2017/07/30/force-with-lease/
不了解rebase的请参考http://gitbook.liuhui998.com/4_2.html
总的来说,避免任何的强制push,最好是创建一个新的commit,然后再push。因为强制push会和其他在同一分支上工作的开发人员产生冲突。
我刚才做了一次硬复位(reset –hard),但是我想回到硬复位前的版本。
如果你不小心reset --hard
,通常你仍然可以得到你的提交,因为git
把所有东西都记录下来几天。
|
|
你会看到你以前的提交记录,并输入重置命令。
|
|
暂存区
我需要add一个文件到之前一次提交的修改里
|
|
译者注:git commit –amend命令是修复最新提交的便捷方式。它允许你将缓存的修改和之前的提交合并到一起,而不是提交一个全新的快照。它还可以用来简单地编辑上一次提交的信息而不改变快照。
我想要add一个文件中的一部分而非整个文件
通常来说,你想要暂存一部分文件,你可以运行
|
|
mention
已被其他开发者翻译: