Git只撤消对特定文件的自动合并,而不是整个分支

Dee*_*e-M 18 git

有没有办法可以撤消一个已更改的文件的自动合并而不是Git中的整个分支?

我想撤消这个合并:

自动合并public/stylesheets/application.css

到以前的版本,其余的保持当前状态.

我试过了:

git reset HEAD~1 public/stylesheet/application.css
Run Code Online (Sandbox Code Playgroud)

但似乎它不起作用.

Mar*_*air 28

当你这样做时:

git reset HEAD~1 public/stylesheet/application.css
Run Code Online (Sandbox Code Playgroud)

...将索引中的文件版本(即分阶段版本)更改为版本HEAD~1- 您的工作副本保持不变. 目前的文档解释如下:

此表单将所有<paths>的索引条目重置为<commit%gt;处的状态.(它不会影响工作树,也不会影响当前分支.)

如果你这样做:

git checkout HEAD~1 -- public/stylesheet/application.css
Run Code Online (Sandbox Code Playgroud)

...将工作副本和分阶段版本更改为版本HEAD~1.这--是为了安全,以防你有文件名,也可以理解为提交.

现在您已经进行了更改,您可以使用以下命令修改合并提交:

git commit --amend
Run Code Online (Sandbox Code Playgroud)

...只要你没有将合并推到任何地方,这是公平的,因为合并仍然只会从一个分支或另一个分支发生变化.


ave*_*ell 6

您不能重置单个文件,因为重置仅适用于整个提交(它基本上“忘记”较新的提交)。此外,您不能“更改”现有提交 - 更多内容请参见下文。

在您的情况下,您有多种选择:

最安全的方法是签出旧版本的文件,然后再次签入

$ git checkout HEAD~1 -- public/stylesheet/application.css
# Back at old version, change already staged
$ git commit -m "Reverted change to public/stylesheet/application.css"
Run Code Online (Sandbox Code Playgroud)

这将简单地创建一个新的提交来回退您的意外更改,并且应该是您的首选选项,除非您确切地知道自己在做什么。

其次,如上重置存储库,并重新检查提交:

$ git reset HEAD~1
# Now restore your file public/stylesheets/application.css
$ git commit -m "Re-checkin of the commit"
# You may use the old checkin message here
Run Code Online (Sandbox Code Playgroud)

这将有效地“更改”现有提交,就像您将在历史记录中具有相同的提交,具有相同的描述,减去对一个文件的修改。但是,这会更改您的历史记录,因此如果已经将原始提交推送到任何上游存储库,则不得使用它。

除了丢弃现有提交并创建新提交之外,Git 不允许您以任何其他方式更改现有提交。这将始终“打破”您的历史记录,并且只有在您确切知道此功能的用途以及您想要这样做的原因时才应使用。


Bom*_*mbe 5

你可能想要.git checkout commit-ish -- file