Git 飞行手册

不再害怕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上显示最新提交的:

      
      
1
      
      
(master)$ git show

或者

      
      
1
      
      
$ git log -n1 -p

我在commit message 里面写了错误的文字信息

如果你写错了,提交还没有被推送,你可以执行以下操作来改变提交信息:

      
      
1
      
      
$ git commit --amend

这将打开一个默认文本编辑器,用于编辑信息。或者,你可以用一个命令来完成这一切。

      
      
1
      
      
$ git commit --amend -m 'xxxxxxx'

如果你已经将本次更新推送到了远程,虽然可以修改提交并强制推送,但不建议这样做。

我用错误的用户名和邮箱commit

如果它是一个单一的提交,修改它

      
      
1
      
      
$ git commit --amend --author “ New Authorname <[email protected]> ”

如果您需要更改所有历史记录,请参阅“git filter-branch”的手册页。

我想要从commit了的文件中将一个文件重置成上一个版本号的内容

      
      
1
2
3
      
      
$ git checkout HEAD^ myfile
$ git add -A
$ git commit --amend

译者注:这三行命令会将myfile文件重置到上一个版本号然后再次一并提交。

我想撤销或删除我最近一次提交

如果你需要删除已经推送过的提交,可以使用如下的方式。但是,这将不可逆转地改变你的提交历史,并且将别人的提交记录都弄糟(因为强制性覆盖)。总之,如果你不确定你的目的,千万别这样做。

      
      
1
2
      
      
$ git reset HEAD^ --hard
$ git push -f [remote] [branch]

如果你还没有推送,把Git重置到上一次提交前的状态。(并且保持你暂存区里的状态)

sh (my-branch*)$ git reset --soft HEAD@{1}

本方法只适用于仍未push的情况,如果你已经push了,唯一安全的做法就是git revert SHAofBadCommit。这将会创建一次新的提交,用于撤销之前所有的更改。如果该分支基本安全(没有其他开发人员负责),直接git push -f也可以。

译者注:resetrevert的区别在于:git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit

删除任意的一次提交

同样警告,如果不是必要,千万别这么做

      
      
1
2
      
      
$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
$ git push -f [remote] [branch]

通过交互式工具进行控制和修改是一个可取的方式。

我尝试把我的修改提交到远程,但是我却收到一条错误信息

      
      
1
2
3
4
5
6
7
      
      
To https://github.com/yourusername/repo.git
! [rejected] mybranch -> mybranch (non-fast-forward)
error: failed to push some refs to 'https://github.com/tanay1337/webmaker.org.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

注意,与rebasing(参见下文)一样,本次修改将会用新的commit记录替代旧的记录,所以你必须强制push(–force-with-lease),当你使用下面的命令的时候一定要指定具体分支

      
      
1
      
      
(my-branch)$ git push origin mybranch --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把所有东西都记录下来几天。

      
      
1
      
      
(master)$ git reflog

你会看到你以前的提交记录,并输入重置命令。

      
      
1
      
      
(master)$ git reset --hard SHA1234(版本号)

暂存区

我需要add一个文件到之前一次提交的修改里

      
      
1
      
      
(my-branch*)$ git commit --amend

译者注:git commit –amend命令是修复最新提交的便捷方式。它允许你将缓存的修改和之前的提交合并到一起,而不是提交一个全新的快照。它还可以用来简单地编辑上一次提交的信息而不改变快照。

我想要add一个文件中的一部分而非整个文件

通常来说,你想要暂存一部分文件,你可以运行

      
      
1
      
      
$ git add --patch filename.x

mention

已被其他开发者翻译:

中文链接

原文:大专栏  Git 飞行手册


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11606556.html