我只是在repo B
中添加了额外的remote A
,然后运行git fetch A
。我怎样才能撤消取物?如果只删除remote A
:git remote remove A1
是否会撤消fetch?
更新:
$ git remote add A path/to/A
$ git fetch A
以上是我运行的命令,结果我得到了所有分支提取到我的repo B
,但我只需要一个特定的分支从repo A
,我需要它去在repo B
的特定文件夹,但这是另一个故事Merge code between two dfferent git repositories。
6条答案
按热度按时间ibps3vxo1#
您可以通过删除远程
A
来撤消 * 所有 * 获取:现在只需再次添加它并只获取单个分支:
wwtsj6pe2#
“撤消”
git fetch
很难,但没有任何理由需要撤消git fetch
。记住,
git fetch
所做的是调用远程,获取分支名称到SHA-1Map的列表,带来提交和其他你需要的对象,以便将它们存储在你的仓库中,然后更新你的远程跟踪分支,使它们指向远程的当前(就像你刚刚调用它的时候一样)分支提示。这对任何工作树文件都没有影响,如果明天再次运行git fetch
,今天完成的任何工作明天都可以跳过。如果你 do 设法撤消fetch
,明天运行的一个将不得不重新做今天完成的工作,所以这是一个净损失:你只是花了一些精力,这样你的git明天就必须通过网络带来更多的代码。这就是说,时间的脚注。:-)
1如果你有远程reflog(你可能有),这并不困难:只需使用远程reflog来查找在最近一次读取中更新的远程跟踪分支(该相同信息在
FETCH_HEAD
文件中也可能仍然可用),然后使用git update-ref
将这些引用指向回它们先前的reflog条目。但是这仍然会将获取的对象留在仓库中,所以要真正清除它们,还必须删除中间的reflog条目,然后运行git gc --prune=now
,这需要非常小心,并且会丢弃 * 所有 * 未引用的对象,而不仅仅是最近的fetch
带来的对象。2我认为有人可能会说“磁盘空间不足”可能是这样做的一个原因,特别是如果一个大对象被意外地推到远程,并将被下一个
fetch
从远程删除。不过,在空间不足的文件系统中工作通常是很棘手的,我不确定除了将整个存储库移动到其他地方(没有磁盘空间问题的地方)之外,我还想在这里做什么。bvjxkvbb3#
我真的很喜欢torek的answer,但它没有提供“更新reflog”的命令,这正是我想要的。我在其他答案reverse a git fetch中找到了这个,所以我把它留在这里以简化搜索其他答案。
让我们假设你有你的
origin
远程和你的本地develop
分支是基于master
,但你的本地master
在origin/master
后面(但你还没有看到它,因为你还没有获取origin
)。所以执行
git fetch
会将来自origin/master
的新提交和标签添加到您的本地存储库。在某些情况下,你根本不想看到那些新的提交,它们会降低历史记录的可读性。话虽如此,您可以通过执行以下操作来“撤消”
git fetch
:所有这一切都是将
origin/master
指针更改为以前的状态。也许您需要使用{n}
来获得确切的状态,但总的来说它可能会有所帮助。qxgroojn4#
非常简单的解决方案:
第二种解决方案:
h4cxqtbf5#
您可以使用以下命令删除意外获取的不想保留的分支:
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
。set-branches的默认行为是总是替换列表。如果要追加,请使用
--add
选项:git remote set-branches --add origin another_branch
cetgtptt6#
如果我是对的,您实际上需要删除从远程存储库获取的分支
A
。此命令用于在本地删除从远程获取的分支:
你可以使用
git branch -a
来检查分支的名称,如果它的名称是remotes/origin/A
,你应该使用git branch -rd origin/A
。您可以通过再次获取来撤消此操作: