Tax*_*Noi 4 git version-control
在我的主分支中,我有两个文件:
file1.txt
file2.txt
Run Code Online (Sandbox Code Playgroud)
我从那里创建了一个名为b1的新分支.在b1中,我修改了file2.txt,并意外删除了file1.txt(从磁盘,当我打开Windows资源管理器到源文件夹时,file1.txt不存在).现在我想保留file2.txt中的更改并从master恢复file1.txt(我不需要删除的版本).我切换到master,做了一个合并到b1,没有发生冲突,它说'所有最新'但是file1.txt不存在.我该怎么办?Tks.
Joh*_*ter 11
我想你在这里问几个问题.第一个似乎是"我如何恢复file1.txt?" 假设您的修订图看起来像这样:
M
(master) o -- o --- o ------o HEAD
\ /
(b1) o -- o -- o
A B C
Run Code Online (Sandbox Code Playgroud)
您可以获取以前的file1.txtvia 副本git checkout:
git checkout HEAD~1 -- file1.txt
Run Code Online (Sandbox Code Playgroud)
这将file1.txt在你的工作副本中复活并上演.你可以git commit和文件一起回来.注意:HEAD~1表示取第一个父项HEAD,它指向合并b1之前的master状态.如果您知道提交ID,则可以使用它而不是HEAD~1.
你似乎要问的另一个问题是"我应该在分支b1做什么来避免这种情况?" 最明显的选择不是首先删除file1.txt.但是我们假设你认为你需要,并认为选择是错误的.接下来,让我们假设您没有通过在某处推送更改来共享分支b1.如果您发现自己立即删除了该文件,则可以执行以下操作:
git checkout HEAD~1 -- file1.txt
git commit --amend
Run Code Online (Sandbox Code Playgroud)
这就是说,"给我回复file1.txt,然后将该文件合并到最新的提交中." 这样做的效果就像你从未删除过的文件一样.
如果您没有注意到文件已被立即删除,并且您之间有多次提交,那么您可能需要查看使用git rebase来解决问题.
如果您在其自己的提交中删除了该文件,那么您可以使用git rebase -i从分支的历史记录中删除提交.让我们假设这B是删除文件的提交,这是该提交中唯一完成的事情.在b1上,你会运行如下:
git rebase -i B~1
Run Code Online (Sandbox Code Playgroud)
删除包含违规提交(B)的行,保存并退出.你的分支刚刚在没有它的情况下重写了它的历史B.例如,我跑了git rebase -i,这在编辑器中显示:
pick 40f76a7 removed bar
pick 30a25f5 modified foo
Run Code Online (Sandbox Code Playgroud)
然后我40f76a7从列表中删除然后离开了我:
pick 30a25f5 modified foo
Run Code Online (Sandbox Code Playgroud)
合并后,历史记录现在如下所示:
M
(master) o -- o --- o ------o HEAD
\ /
(b1) o ------- o
A C'
Run Code Online (Sandbox Code Playgroud)
请注意,提交ID C'不同于C因为B不再存在,并且父sha1是提交ID的一部分.IOW,C的sha1改变了,因为我们重写了历史.
如果您file1.txt在同一次提交中删除并进行了一系列其他更改,那么还有一些步骤.首先,恢复文件并提交它:
git checkout B~1 -- file1.txt
git commit -m "Reinstate file1.txt"
Run Code Online (Sandbox Code Playgroud)
我们来调用新的提交D.我们的修订图现在看起来像
M
(master) o -- o --- o -----------o HEAD
\
(b1) o -- o -- o -- o
A B C D
Run Code Online (Sandbox Code Playgroud)
现在,做:
git rebase -i B~1
Run Code Online (Sandbox Code Playgroud)
并将包含commit id的行移动D到刚刚提交id之后B,并更改pick为squash.例如,我在运行时得到这个git rebase -i B~1:
pick 40f76a7 removed bar plus other changes
pick 30a25f5 modified foo
pick 6177cb7 add bar
Run Code Online (Sandbox Code Playgroud)
6177cb7是恢复bar的提交.所以我在下面移动它40f76a7并将命令更改为squash:
pick 40f76a7 removed bar plus other changes
squash 6177cb7 fix bar
pick 30a25f5 modified foo
Run Code Online (Sandbox Code Playgroud)
保存并退出.它会要求您修复提交消息.去做.完成所有操作后,最终得到的历史记录如下:
M
(master) o -- o --- o -----------o HEAD
\
(b1) o -- o -- o
A B' C'
Run Code Online (Sandbox Code Playgroud)
新的B'不再删除file1.txt.此时,您已准备好与master合并.
几句结束语.小心git rebase.如果你不小心,你可能会失去历史.请务必阅读git rebase手册页.那里有很多有用的信息.注意:git rebase只有在您想要删除从历史记录中删除文件的事实时,才需要使用所有这些工作.如果您可以通过提交显示您将文件恢复,那么无论如何,请使用git checkout还原文件并提交它.对于新的git用户来说,它不那么乏味,而且更容易. git rebase是非常先进的,需要一些练习.但是,如果你花时间学习它,它真的非常有用.
| 归档时间: |
|
| 查看次数: |
4265 次 |
| 最近记录: |