“ Git Pull Force ”、“ git reset branch to origin ”,或者換句話說,拉一個遠程分支來覆寫一個本地分支,似乎是一個被廣泛搜索的功能,盡管本地下降很少,但它的興趣越來越大。
對于不斷增長的團隊和不斷增加的開發人員數量,這絕對是有意義的。

目前,最短的作業解決方案非常冗長,需要了解分支
git reset --hard origin/<branch_name>
這是不幸的,因為輸入以下內容要快得多
git pull
然而,這也帶來了自己的挑戰。不同的歷史,合并沖突等......
我們確實有這樣的速記
git push origin HEAD -u --force
它將本地分支推<branch_name>送到原點,覆寫具有相同名稱的遠程分支<branch_name>并將其設定為它自己的上游分支。
但是,沒有這樣的--force/reset 替代git pull.
將此功能添加到git的最佳方法是什么?
如何強制“git pull”覆寫本地檔案?6.6m 視圖
將本地存盤庫分支重置為與遠程存盤庫 HEAD 一樣4.7m 視圖
如何強制 git pull 在每次拉取時覆寫所有內容?370k 視圖
從 Git 遠程拉取時使用遠程更改解決沖突240k 視圖
執行 git pull 時如何強制更新?90k 次查看
強制 GIT 拉動而不提交
使用
git 強制拉動 使用隱式 rebase的 git force pull
清理一個分支并從上游重新啟動它
拉動時強制 git 更新我
的本地存盤庫 將本地存盤庫的所有分支重置為與遠程相同
Github - 放棄所有更改
uj5u.com熱心網友回復:
我要強調的是,雖然您肯定提到了每天都會出現的需求,但在沒有警告的情況下git強行洗掉您的作業的命令也是問題的來源,會帶來更多的破壞性后果(查找“我在git reset --hard/之后丟失了我的作業git checkout .,我能得到它嗎?回來了?”問題)。
以您的示例為例,當您使用遙控器時,您不知道將從遙控器中得到什么pull -f,這一事實會放大這一點。
根據我的拙見,我強烈建議養成不使用git pull而只使用的習慣git fetch。
然后檢查差異origin/branchname,然后選擇是否要重置或變基或...
有一個命令說“移至該提交并丟棄所有更改”會很好,我將在這里重復我在對@VonC 的回答的評論中建議的內容:
#!/bin/bash
target=$1
if [ -z "$target" ]; then
target=HEAD
fi
set -e # avoid going forward if one command fails ...
git stash
git restore -SW -s "$target" -- .
git reset "$target"
(我沒有一個好的別名:git goto?)
它將提供一個相當安全的替代方案git reset;主要的警告是:磁盤上的檔案,在開始提交中沒有被跟蹤但被跟蹤$target將被覆寫而不被保存。
您還需要一個更復雜的變體git stash來保存這些檔案。
[更新] 我想我找到了一個腳本,可以隱藏受影響的檔案(并且只有那些):
#!/bin/bash
target=$1
if [ -z "$target" ]; then
target=HEAD
fi
set -e # avoid going forward if one command fails ...
list_impacted_files () {
local target=$1
# tracked files in the working tree that have a diff
git diff --no-renames --name-only HEAD
# untracked files that will be clobbered when restoring $target :
# * files that are present in $target but not in HEAD
# * and that currently exist on disk (use 'ls' to keep only those)
# add '|| true' to ignore error code returned by 'ls' on non existing files
git diff --no-renames --name-only --diff-filter=A HEAD "$target" |\
xargs -r ls 2> /dev/null || true
}
# list files as described above, and feed this list to `git stash -u`
# 'xargs -r <cmd>' avoids running <cmd> at all if stdin is empty
# in our case: don't run 'git stash -u' if no files are to be stashed ...
list_impacted_files "$target" | xargs -r git stash -u --
git restore -SW -s "$target" -- .
git reset "$target"
要將您的存盤庫恢復到原來的狀態:
- 恢復到初始提交(使用
git reset或上面的腳本......) - 找到
stash@{xx}你想恢復的地方git stash list - 跑
git stash apply --index stash@{xx}
uj5u.com熱心網友回復:
您至少需要三個命令:
- 獲取,更新遠程跟蹤分支
- 使用
@{u}or@{upstream}后綴重置上游分支 - 清理以確保沒有多余的檔案留下
那是:
git fetch
git reset --hard @{u}
git clean -nd
git clean(在-nd選項中替換-fd為實際洗掉檔案:我總是喜歡先預覽git clean 會做什么,然后再實際洗掉任何內容)
您必須將它們分組為別名或腳本 ( git-pullreset),然后您可以呼叫它們。
LeGEC在評論中建議:
git stash
git restore -SW -s @{u} -- .
git reset @{u}
那會:
- 保持完全未跟蹤的檔案(例如:未在 HEAD 或 中跟蹤的檔案
@{u})保持不變,并且- 將提供一種方法,使仍然有一些東西可以恢復到“以前的樣子”。
uj5u.com熱心網友回復:
我將采取不同的方法,挑戰問題的前提。如果您發現自己必須調整本地分支以匹配遠程分支,這表明您永遠不應該有本地分支以.
相反,以這樣一種方式作業,即您使用的分支是遠程跟蹤分支,因此無需調整。
以我為例。我整天都在靈活地制作小功能分支,并推動它們形成合并到主的拉取請求。但我自己沒有 main。我需要它做什么?沒有!
- 要啟動一個功能分支,我從 origin/main 開始獲取并創建分支。
- 為了研究遠程 main 的狀態,我獲取然后檢查 origin/main,分離。
- 為了審查一個拉取請求,我獲取然后檢查 origin/yourbranch,分離。
所以我唯一擁有的本地分支是我自己的特性分支——它們沒有上游并且不能被拉取(也不需要,因為它們中唯一的進一步提交將來自我)。
簡而言之,我的建議是,如果人們真的想知道如何“拉出遠程分支以覆寫本地分支”作為他們常規作業流程的一部分,那么這只是表明他們一開始就錯誤地使用了 Git。除非:
- 您將向它添加提交并推送它,或者
- 您將在本地合并到它,這在當今的拉取請求世界中通常不是這種情況,或者
- 它純粹是本地的和實驗性的,即您只是在開發功能時嘗試一種可能的方法。
這些場景都不會涉及相應的遠程跟蹤分支,因此問題中提出的情況永遠不會出現。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/472758.html
標籤:混帐
