如何使用git fetch

0tdrvxhp  于 2023-09-29  发布在  Git
关注(0)|答案(6)|浏览(141)

我只是在repo B中添加了额外的remote A,然后运行git fetch A。我怎样才能撤消取物?如果只删除remote Agit 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

ibps3vxo

ibps3vxo1#

您可以通过删除远程A来撤消 * 所有 * 获取:

git remote remove A

现在只需再次添加它并只获取单个分支:

git remote add A <path/to/repository>
git fetch A <name of branch>
wwtsj6pe

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从远程删除。不过,在空间不足的文件系统中工作通常是很棘手的,我不确定除了将整个存储库移动到其他地方(没有磁盘空间问题的地方)之外,我还想在这里做什么。

bvjxkvbb

bvjxkvbb3#

我真的很喜欢torek的answer,但它没有提供“更新reflog”的命令,这正是我想要的。我在其他答案reverse a git fetch中找到了这个,所以我把它留在这里以简化搜索其他答案。
让我们假设你有你的origin远程和你的本地develop分支是基于master,但你的本地masterorigin/master后面(但你还没有看到它,因为你还没有获取origin)。
所以执行git fetch会将来自origin/master的新提交和标签添加到您的本地存储库。在某些情况下,你根本不想看到那些新的提交,它们会降低历史记录的可读性。
话虽如此,您可以通过执行以下操作来“撤消”git fetch

git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}

所有这一切都是将origin/master指针更改为以前的状态。也许您需要使用{n}来获得确切的状态,但总的来说它可能会有所帮助。

qxgroojn

qxgroojn4#

非常简单的解决方案:

git reset --keep HEAD@{1}

第二种解决方案:

git reset --hard master@{"10 minutes ago"}
h4cxqtbf

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

cetgtptt

cetgtptt6#

如果我是对的,您实际上需要删除从远程存储库获取的分支A
此命令用于在本地删除从远程获取的分支:

git branch -r -d <branch-name>

你可以使用git branch -a来检查分支的名称,如果它的名称是remotes/origin/A,你应该使用git branch -rd origin/A
您可以通过再次获取来撤消此操作:

git fetch origin

相关问题