我正在阅读Git书,对于修改提出了一个好奇的一面:
但是,在[更改分支]之前,请注意您的工作目录或 暂存区域具有与分支冲突的未提交更改 你正在退房,Git不会让你换分支机构。这是最好的 切换分支时,请保持干净的工作状态。有办法 绕过这个(即,藏匿和修改)我们会 稍后介绍
https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
我理解存储是如何帮助的,因为您基本上将未提交的更改存储在存储中,以便以后可以重新应用它们,使您的工作/暂存位置没有任何未提交的更改。但我真的没有看到如何在这种情况下使用修改修改。有什么想法吗?
答案 0 :(得分:3)
正如他们在那里所说,“我们将在稍后介绍”。 :-)关键是你可以继续现在提交 ,制作一个永久的, 1 不可更改的临时工作状态副本。你可以从这开始:
...--o--o <-- master
\
o--o--o <-- feature
您正在为feature
的下一次提交工作。它尚未准备就绪,但您必须在其他地方修复(在master
或其他分支中)。因此,如果您git add
所有内容和git commit
,您将获得一个新的,永久性的,但您想要的临时提交:
...--o--o <-- master
\
o--o--o--● <-- feature
稍后,您回到分支feature
,它有这个糟糕的(纯黑色圆圈)提交。现在,您完成了预期要提交的工作,并使用git commit --amend
。
git commit --amend
做的是像往常一样进行新提交,除了将添加到分支的顶端,而不是将当前的提交推到一边:
...--o--o <-- master
\
o--o--o--o <-- feature
\
● [abandoned]
这个现在被放弃的提交,仍然像任何Git提交一样永久且不可更改,不再是 findable 。如果您查找从feature
开始并向后(向左)工作的提交,您将看不到它。如果您查找从master
开始并向后工作的提交,您将看不到它。您可以找到它的唯一方法是使用Git的 reflogs ,默认情况下,它会暂停这些放弃的提交一段时间 - 至少30天。
最终,保持提交●的reflog条目或条目将过期。在这一点上,提交不受git gc
肆虐的鬣狗的保护:他们最终会找到并肢解提交,消耗掉骨头和所有内容,而且它似乎永远都不会发生。
1 像Git中的任何东西一样永久,就是:Git会努力记住它,但是一旦找不到它,这些提交就会被收集起来作为垃圾扔掉。 Mercurial有点不同:永久提交是完全永久的,就像在Git中一样,直到你运行hg strip
,删除它们及其所有后代。
答案 1 :(得分:-1)
使用git修改将现有提交更改为另一个提交,因为消息不同。那么你基本上是在同一个分支上,你可以提交你未提交的更改。如果您想返回其他分支机构,您仍然可以发出“结帐”信息。命令到达那里,它不包含你未提交的更改。
我应该补充一点,如果你要修改,你真的需要跟踪提交哈希,这样你就不会迷路。使用真实(例如特征)分支或存储更像是一种标准的方法。我认为修改实际上是为了它的名字..来修改提交消息,而不是用哈希来玩。