2014-02-21 104 views
0

我有类似以下的目录结构:撤销git remote add upstream?

~/workspace/ 
    -- proj1/ 
    -- proj2/ 

proj1和proj2是不同的工作git的回购协议。今天我想添加另一个项目,所以我在GitHub上分叉它,然后在本地克隆我的fork。这一切都进展顺利,但是我想添加上游的远程设备,以便以后可以同步我的叉子。 我想都没想就跑到

git remote add upstream <upstream:url> 
git fetch upstream 
git merge upstream/master 

在〜/工作区目录。 这将上游回购的内容添加到〜/ workspaces目录。它没有触及proj文件夹,这很好。 我从工作空间删除了所有意外添加的文件,并获得了所有设置,这是我原本打算的方式,但是现在如果从〜/ workspaces运行git log,我将获得上游回购的历史记录。

什么是阻止思想〜/ workspaces git的最佳方法是回购?

在此先感谢

回答

1

假设一切都干净,当你做了git merge,你可以简单地git reset --hard HEAD^于未执行合并,并git remote remove upstream删除远程和所有upstream/*远程分支机构。 (您选择的提交了做git fetch upstream加上合并仍然会在你的仓库,但除了占用磁盘空间,他们应该是无害的。最后,没有引用剩下的,他们将垃圾收集。)

请记住,虽然git merge在工作目录中做了很多工作,但最终,就存储库而言,它所做的只是创建一个新的提交,它具有作为其第一个父代的前一个提示您所在的分支以及其父母的其余部分,您合并分支的小费:

before merge: 
...--o--o--T  <-- HEAD=your-branch 

...--o--o--o  <-- upstream/master 

after merge: 
...--o--o--T 
      \ 
      M <-- HEAD=your-branch 
      /
...--o--o--o  <-- upstream/master 

其中T是您的上一个分支提示,M是合并提交。名称HEAD^的意思是“查找当前分支的提示” - 这是提交M - “并备份到它的第一个父母”:这是提交T,通过合并的定义。然后,git reset --hard <sha-or-other-identifier>告诉git做两件事:

  1. 更改当前分支提示指向给定的提交。在这种情况下,这意味着:将your-branch的提示设置为提交T
  2. 清理工作目录以使其看起来像给定的提交(的--hard部分)。

第1步,使提交图形看起来就像这样:

...--o--o--T  <-- HEAD=your-branch 
      \ 
      M [abandoned] 
      /
...--o--o--o  <-- upstream/master 

一旦做到这一点,合并提交M留在库中,但没有分支机构或其他标签指向它,所以是我喜欢称之为“废弃”的东西。当reflog条目到期并且提交被垃圾收集时,它将在30天后真正消失。如果你也然后将其删除upstream/master,垃圾收集M导致提交的整个下链也成为收集好,你让你的所有磁盘空间了。


当然,而且,作为它的“树”,这次合并提交了合并后的工作目录的内容。

我的意思是标签的方式,引用日志条目不是标签本身。他们作为临时参考;它们默认持续30到90天,到期时间由两个配置项控制。较短的(30天)期满适用于引用日志指向是不从尖端到相应的参考点可达提交项。

上面是复杂的,但它意味着,例如,如果你在分支devel,你做了一些提交,那些提交进入devel reflog。假设你做了4次提交,然后git reset --hard HEAD^“撤消”最后一次提交。分支devel的提示现在指向您的第三次提交。第三次提交指向第二次,第二次提到第一次。这三个reflog条目现在被认为比第四次提交的条目“更有价值”:如果您从提交devel名称开始,则不能前进到第四次提交,只能向后移动。

因此,其中三个reflog条目将在您的配置中保留90天,或者任何值在gc.reflogexpire之间。第四个只会持续30天,或者任何价值在gc.reflogexpireunreachable

我刚刚注意到git的新版本(哪些?)用gc.pattern.reflogexpiregc.ref.reflogexpireunreachable对此进行了扩充。这意味着,例如,您可以设置gc.refs/stash.reflogexpireunreachable以保持“上一级”挡板(如[email protected]{2})大于默认的30天,而不会保留其他更长时间段的引用日志条目。

+0

真棒!效果很好,细节+1 – jwags