我是一个有帮助的助手,可以为您进行文本翻译。
我已经使用Git很长时间了,但最近遇到了一个有趣的技巧,可以在合并期间撤销文件变更历史记录。以下是重现步骤:
我有一个包含两个文件和一个提交的git存储库:
$ git branch
* master
$ git log --oneline
80c8d5a Initial commit
$ git log --oneline -- README
80c8d5a Initial commit
$ ls
README conflict_file
我正在创建新的实验分支并更改README和conflict_file文件:
$ checkout -b experiment
Switched to branch 'experiment'
$ vim README
$ vim conflict_file
$ git commit -am "Experimental changes"
[experiment cdbc988] Experimental changes
2 files changed, 2 insertions(+)
$ git log --oneline -- README
cdbc988 Experimental changes
80c8d5a Initial commit
回到主分支并编辑冲突文件(以在合并过程中出现冲突):
$ git checkout master
Switched to branch 'master'
$ vim conflict_file
$ git commit -am "Master changes"
[master ad8b68e] Master changes
1 file changed, 1 insertion(+)
以下是我的存储库状态:
$ git log --oneline --decorate --graph --all
* ad8b68e (HEAD, master) Master changes
| * cdbc988 (experiment) Experimental changes
|/
* 80c8d5a Initial commit
尝试与实验分支合并:
$ git merge experiment
Auto-merging conflict_file
CONFLICT (content): Merge conflict in conflict_file
Automatic merge failed; fix conflicts and then commit the result.
$ git mergetool
<merging conflict in conflict_file>
这是个小技巧:
$ git reset HEAD README
Unstaged changes after reset:
M README
$ git commit
[master 909139f] Merge branch 'experiment'
$ git log --oneline -- README
80c8d5a Initial commit
我丢失了引入实验性分支中Experimental changes提交中的README文件的更改和历史记录。是否有人能够说明这与Git知道所有更改的思想有何关联?是否有可能避免这种情况发生?这可能会成为我们公司的问题,因为合并是开发人员可以执行的操作,但他们可能会意外地删除别人的更改。
git log
命令的--full-history
选项。同时阅读有关“历史简化”的手册页面:“默认模式...是解释树的最终状态的最简单历史记录。” - chirluREADME
文件的更改消失感到惊讶呢?你明确使用了git reset HEAD README
来请求这样做。 - Chronialgit log --follow --<file>
帮助了我。 - erkfel