2010-04-19 49 views
28

据我所知,git pull someRemote master试图将远程分支合并到我的。我可以告诉git pull覆盖而不是合并?

有没有办法说“完全丢弃我的东西,只是让我使用git pull的另一个远程克隆”?我仍然想保留自己的存储库并保存它的历史记录,但是我希望在该命令之后有1:1的someRemote主分支副本。

为了澄清,想象有2个存储库,RM和MY。数字是提交,并且这只假定一个分支(主)。

 
RM1 --- RM2 --- RM3 --- RM4 --- RM5 --- RM6 ... 
|      | 
+-> MY1 --- MY2 --- MY3 -+-> MY4 --- MY5 --- MY6 ... 

因此,我开始自己的存储库作为RM1的克隆。然后我开心地开发,RM开心开心,但我们从不分享我们的工作。在MY3之后,我意识到我的分支不是那么棒,但是RM4相当不错。所以我想git pull RM4进入MY。不过,我不希望我的MY1-3的变化持续下去,我想让MY4成为RM4的1:1副本。

但是,我想保留我的历史记录,理想情况下我希望在MY3和RM4之间或MY3和RM2-4之间设置更改。

它应该仍然留在我的资料库。

这可能吗? (这适用于GitHub项目,我可以在其中分解一个项目,稍微试验一下,让它独立几个星期,但是希望在不更改的情况下更新它,此刻我删除了我的叉子并重新分叉,这不是最好的方法。)

回答

34

首先,你的主分支重命名为别的东西:

git branch -m master my_old_master 

然后,创建一个新的主人:

git checkout -b master someRemote 

有关Git的分支名称的伟大的事情是,他们不是真正的自己的地方,他们只是指针的地方(其中一个“地方”是一个SHA1提交ID)。

+0

基本上我必须核弹我的分支?有没有办法让git神奇地合并这些更改,使它看起来像一个新的修订版本?我想保留我的分支和它的历史,我只是想让当前修订版本成为当前远程修订版的1:1副本。或者这仍然有效,新主人与老主人分享历史? – 2010-04-19 05:33:10

+4

@迈克尔:你的改变不会消失;它们仍然存在于my_old_master分支中。如果您只需要一个分支,则您的“远程1:1副本”和“保留我的历史记录”的目标不兼容。因为修订版SHA1包含所有历史记录的SHA1,所以除非* all *历史在两个分支中都相同,否则分支与另一个分支不同。 – 2010-04-19 05:49:26

+0

为了得到这个工作,我必须首先获取远程分支。 – 2011-03-19 20:40:37

4

听起来就像你在git checkout之后,这会放弃你对本地路径的修改。

您可以使用Google Checkout恢复您的更改:

git checkout myfile.h 

就会从索引恢复myfile.h

http://git-scm.com/docs/git-checkout

+0

我想结帐只复位我的本地工作副本的最后修订在我的回购协议。它是否适用于遥控器? – 2010-04-19 05:33:51

+1

是的,'git checkout'需要一个提交参数,所以'git checkout origin/foo bar.baz'是可能的。 – Bombe 2010-04-20 12:27:31

2

如果您想保留当前的主分支但注册新版本(镜像远程分支),您可以;

  • 注册合并筛选器驱动程序(只是本次合并:a keepTheir one
  • git pull --no-commit
  • 检查是否有没有需要被删除(在你的主人是不存在的文件的额外文件在远程分支)
  • 提交