在Git中有选择地还原或签出对文件的更改?

180*_*ION 84 git

是否有一个命令允许您部分撤消对工作目录中文件(或多个文件)的更改?

假设您已经编辑了很多文件但是您意识到要将某些更改撤消回已提交状态,而不是其他更改.

我正在设想一个git checkout类似的选项git add -p,即它通过hunk传递文件块并询问你是否要保留它.

thi*_*eek 112

使用git版本> = 1.7.1我可以

git checkout -p
Run Code Online (Sandbox Code Playgroud)

我不确定这个功能何时推出.

  • 值得一提的是,您还可以执行`git reset -p`来有选择地从暂存区/索引中取消更改.我也不知道在哪个版本的Git中引入了这个版本. (11认同)
  • @wukong 因为这个答案是在问题提出两年后发布的。此时此刻(2009年),查尔斯的回答就是最好的解决方案 (2认同)

CB *_*ley 82

你可以用

git add -p <path>
Run Code Online (Sandbox Code Playgroud)

然后,将您要保留的块保存在特定文件中

git checkout -- <path>
Run Code Online (Sandbox Code Playgroud)

通过签出文件的暂存版本来丢弃您不想保留的工作树更改.

最后,你可以使用

git reset -- <path>
Run Code Online (Sandbox Code Playgroud)

将文件的暂存版本还原到文件的最新提交版本,以使您的更改不受影响.

  • @Jan其他版本控制系统的'revert`命令允许您选择文件中的哪些更改被还原?真实地问,因为我只有CVS和Git的经验.在Git中,`git checkout - path/to/file`是一个恢复该文件中所有更改的命令,但这与上面的不同. (5认同)
  • 还有`git checkout --patch`和`git reset --patch`在最新的git中像`git add --patch`一样工作. (3认同)
  • @Rudie,` - `通常表示选项解析的结束,并且在它之后的任何参数都要按字面解释.这意味着你不必在任何以减号开头的文件名之前添加`./`,如果文件名在`--`之后. (2认同)

Kor*_*tor 8

git checkout $file将文件的状态恢复为$file上次提交的状态.我认为您可以使用git checkout SHA-1 -- $file将文件还原为SHA-1标识的提交.