在我的 GitHub 中,我已經成功合并了我的拉取請求并洗掉了分支sec1。然后,我在本地洗掉我的分支。但是,當我輸入時git branch -a,我仍然可以看到remotes/origin/sec1分支,如下所示
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/sec1
然后,我嘗試git push origin --delete sec1但它給了我這個錯誤:
error: failed to push some refs to https:/.../
任何人都可以幫助解決這個問題?
uj5u.com熱心網友回復:
TL;DR:我推薦git fetch --prune,但通過不同的路線(設定fetch.prune為true然后運行git fetch)。
更長
在我的 GitHub 中,我已經成功合并了我的拉取請求并洗掉了分支
sec1。
如果您尚未完成洗掉,您的后續git push -d命令將是正確的,并且會起作用。在GitHub的存盤庫中的分支已經消失了,并試圖洗掉再次失敗,因為有沒有什么做!
然后,我在本地洗掉我的分支。
請注意,他們 sec1是您的 origin/sec1;你的sec1就是你的 sec1。所以你現在已經洗掉了他們 sec1和你的 sec1.
但是,當我輸入時
git branch -a,我仍然可以看到remotes/origin/sec1分支
那實際上不是分支。那是您的 Git 對其 Git 分支名稱的記憶。我更喜歡稱其為遠程跟蹤名稱。
有兩種方法可以讓你的 Git 洗掉它:
使用
git branch -r -d: the-d是洗掉標志,該-r標志告訴您的 Git 您對分支名稱不感興趣,而對遠程跟蹤名稱感興趣。(-a您現在使用的標志告訴您的 Git 您對所有名稱都感興趣,即分支名稱和遠程跟蹤名稱。您只能將它與串列選項一起使用,而您可以使用-r串列選項或用于洗掉。)或者,讓你的 Git 再次掃描他們(GitHub 的)分支,看看它們
sec1已經消失了,因此你的 Git 應該洗掉其sec1.
細節
第一個非常簡單:命令
git branch -d -r origin/sec1
指示您的 Git 洗掉遠程跟蹤名稱origin/sec1。它消失了,你就完成了。但是,必須經常這樣做很煩人。
請注意,您可以隨時洗掉任何遠程跟蹤名稱。當你運行時:
git fetch origin
要不就:
git fetch
你的 Git——我說的“你的 Git”是指你的 Git 軟體,在你的筆記本電腦上本地處理你的存盤庫——呼叫他們的 Git(存盤庫和 Git 軟體在你克隆的 GitHub 上)。他們的 Git 列出了他們所有的分支名稱以及與這些分支名稱對應的提交哈希 ID。
Your Git now decides which of those branch names are "interesting" to you. The default, for a normal clone, is "all of them", but you can make a so-called single-branch clone where your Git throws away all but one name. Your Git then asks their Git for any commits they have that you don't, because the real purpose of Git is to store commits. So they now package up any commits they have, that you don't, that you need to go along with their branch names, and send those over. That's when you see stuff like:
remote: Counting objects: 100% ...
and:
Receiving objects: ...
and so on: at this point, your Git is getting their commits to add to your repository.
Once your Git has safely saved away all their commits and other supporting objects, your Git now updates your Git's memory of their Git's branch names. These are your remote-tracking names. Your Git simply takes each of their branch names and sticks origin/ in front of them.
(The origin/ part here is from the name origin, which is what we used when we ran git fetch origin. This name is a remote. You can have more than one, but git clone sets up the first standard remote using the name origin, and in many cases that's all we ever need. So origin is the one you see all the time. The remote's #1 purpose is to remember the URL: the ssh://[email protected]/you/repo.git or whatever, so that you don't have to retype it every time.)
Remote-tracking names are forever, or not
For some reason—probably, "by mistake", though only those who invented these things back in 2005 or so1 could say for sure—whoever invented remotes and remote-tracking names decided that the way they would work by default is that your Git will have their Git list out their branch names, and then after your Git gets all their commits, your Git will create or update a remote-tracking name for each branch.
Well, that's fine for a while. But their Git—in this case, the one over on GitHub—sometimes has branches deleted. If your Git just adds remote-tracking names, and never deletes them, then at some point you run:
git fetch origin
and acquire:
origin/hoopy-frood
origin/zaphod
Later, one or both of these is gone, but your Git never deletes either one. So you—or your Git—will hang on to their branches forever, even though they don't.
You can of course delete them one by one, but wouldn't it make more sense for your Git to notice that, gosh, they used to have a hoopy-frood and a zaphod, but they don't any more? Your Git could automatically delete your origin/hoopy-frood and origin/zaphod at this point.
Well, someone finally got around to putting that into Git, some time after the invention of remote-tracking names. They added the --prune option:
git fetch origin --prune
means call up the Git at origin, list out their branch names, get their commits and create or update my remote-tracking names, and oh by the way delete the cruft too please. This ought to be the default, but it was too late to make it the default.
Fortunately, you can make it your default. Set the fetch.prune option to true in your Git configuration, and it becomes your default. Use:
git config --global fetch.prune true
to set this in your per-user configuration, so that it applies to all your repositories. Then:
git fetch origin
will reach out to origin, list out their branch names, get their commits, and clean up too. Running git fetch without specifying origin in particular will reach out to the appropriate remote, whatever that is,2 and do the same sort of thing.
1Very early Git didn't have these. You ran git fetch url every time, and then carefully picked stuff out from the mess it left behind. Both the typing-in of URLs, and the picking-out of stuff, got boring and repetitive, and there were several competing ways to make this easier. The method of using remotes and remote-tracking names won the popularity contest, but you can still see pieces of the various other methods if you read the git fetch documentation carefully.
2如果您有多個 remote,有時您會希望git fetch從一個遠程獲取,有時您會希望它從另一個獲取。Git根據當前分支的上游設定確定使用哪個,這通常是您想要的。
如果git fetch要從所有遙控器獲取,可以使用git fetch --all. 但是,如果您想要這種東西,通常最好切換到 using git remote update,它具有更好的控制。它默認更新所有遙控器,但可以讓您做各種聰明的事情。請參閱該git remote檔案的詳細資訊。
uj5u.com熱心網友回復:
遠程試試這個:
git push -d origin <Branch-Name>
本地:
git branch -D <Branch-Name>
uj5u.com熱心網友回復:
運行 first git fetch,從原始(遠程)檢索最新的元資料資訊。然后執行git branch --delete sec1。
如果這不起作用,您可能需要force-option(-D是--deleteand的快捷方式--force):
git branch -D sec1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/337419.html
上一篇:如何在UICollectionView中的部分上繪制角和陰影?
下一篇:Git從存盤庫中洗掉檔案?
