我刚向remote A
添加了repo B
,然后运行了git fetch A
如何撤消获取?如果我只删除remote A
:git remote remove A1
,它会撤消提取吗?
更新
git remote add A path/to/A
git fetch A
以上是我运行的命令,结果我将所有分支都提取到我的repo B
但是我只需要repo A
中的一个特定分支,我需要它进入{{1的特定文件夹但那是另一个故事Merge code between two dfferent git repositories
答案 0 :(得分:19)
只需删除此遥控器,即可撤消远程A
中的所有提取:
git remote remove A
现在再次添加它并仅获取单个分支:
git remote add A <path/to/repository>
git fetch A <name of branch>
答案 1 :(得分:11)
1 很难“撤消”git fetch
,但 2 git fetch
。
请记住,git fetch
所做的是调用远程,获取分支名称列表到SHA-1映射,引入提交和其他对象,以便将它们存储在存储库中,然后更新您的远程跟踪分支,以便它们指向远程的当前(截至您刚刚打电话的时候)分支提示。这对任何工作树文件都没有影响,如果明天再次运行git fetch
,今天完成的任何工作都可以在明天跳过。如果你做设法撤消fetch
,那么明天运行就必须重新完成今天完成的工作,所以这是一个净损失:你只是花了一些力气让你的git明天必须通过网络提供更多代码。
那说,脚注的时间。 : - )
1 如果你有远程reflog(你可能会这样做),那么 是不是:只需使用远程reflogs来查找最近更新的远程跟踪分支fetch- FETCH_HEAD
文件中仍然可以使用相同的信息,然后使用git update-ref
将这些引用指回其先前的reflog条目。但是这仍然会将获取的对象保留在您的存储库中,因此要真正清除它们,您必须删除中间的reflog条目,然后运行git gc --prune=now
,这需要非常小心并将丢弃所有未引用的对象,而不仅仅是最近fetch
带来的对象。
2 我认为有人可能认为“磁盘空间不足”可能是这样做的一个原因,特别是如果一个大型对象意外被推到遥控器并将被从遥控器中移除到下一个fetch
。但是,在一个空间不足的文件系统中工作一般都很棘手,而且我不确定除了将整个存储库移动到其他位置(没有磁盘空间问题的地方)之外我还想做很多事情。
答案 2 :(得分:2)
我真的很喜欢来自 torek 的回答,但它并没有为你提供更新reflogs&#34;的命令,这正是我想要的。我在其他答案reverse a git fetch中找到了这个,所以我把它留在这里以简化对其他人的搜索。
假设您拥有origin
遥控器,而您的本地develop
分支基于master
,但您的本地master
落后于{{1} (但你还没有看到它,因为你还没有获得origin/master
)。因此,执行origin
会将git fetch
的新提交和标记添加到您的本地仓库。在某些情况下,您根本不想查看这些新提交,这会降低您的历史记录的可读性。
话虽如此,你可以&#34;撤消&#34; origin/master
做:
git fetch
它所做的只是改变git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}
指向前一状态的指针。也许你必须使用{n}来获得准确的状态,但总的来说它可能会有所帮助。
答案 3 :(得分:2)
非常简单的解决方案:
git reset --keep HEAD@{1}
或第二种解决方案:
git reset --hard master@{"10 minutes ago"}
答案 4 :(得分:0)
您可以使用以下命令删除您不希望保留的任何意外分支:
git update-ref -d refs/remotes/YOUR_REMOTE_NAME/BRANCH_NAME_TO_DELETE
为防止再次获取它们,请将您的git remote设置为仅获取指定的分支:git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc]
,例如git remote set-branches origin master
。
分支机构的默认行为是始终替换列表。如果要追加,请使用--add
选项:git remote set-branches --add origin another_branch