“ Git Pull Force ”、“ git重置分支到原点”或者换句话说,拉出远程分支来覆盖本地分支,似乎是被广泛搜索的功能,尽管本地很少有下降,但人们对它的兴趣却越来越大。
\n对于不断壮大的团队和不断增加的开发人员数量来说,这绝对有意义。
\n\n目前,最短的工作解决方案非常冗长并且需要分支知识
\ngit reset --hard origin/<branch_name>\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
不幸的是,因为输入以下内容要快得多
\ngit pull\nRun Code Online (Sandbox Code Playgroud)\n然而,这也带来了其自身的挑战。历史分歧、合并冲突等等……
\n我们确实有这样的简写
\ngit push origin HEAD -u --force\nRun Code Online (Sandbox Code Playgroud)\n它将本地分支推<branch_name>送到原点,覆盖同名的远程分支<branch_name>并将其设置为自己的上游分支。
然而,没有这样的--force/ reset\xc2\xa0 替代git pull。
将此功能添加到git 的最佳方式是什么?
\n如何强制“git pull”覆盖本地文件?6.6m 视图
\n将本地存储库分支重置为就像远程存储库 HEAD 4.7m 视图
\n如何强制 git pull 在每次拉取时覆盖所有内容?370k 视图
\n从 Git 远程拉取时使用远程更改解决冲突240k 视图
\n执行 git pull 时如何强制更新?90k 视图
\n强制 GIT 拉取而不提交
\n使用 git 强制拉取
\n带有隐式变基的 git 强制拉取
\n清理 fork 并从上游重新启动它
\n拉取时强制 git 更新我的本地存储库
\n重置本地存储库的所有分支与远程存储库相同
\n Github - 放弃所有更改
我要强调的是,虽然您确实提到了每天都会出现的需求,但在没有警告的情况下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"
Run Code Online (Sandbox Code Playgroud)
(我没有一个好的别名: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"
Run Code Online (Sandbox Code Playgroud)
要将您的存储库恢复到原来的状态:
git reset或上面的脚本...)stash@{xx}您想要恢复的位置git stash listgit stash apply --index stash@{xx}您至少需要三个命令:
@{u}@{upstream}那是:
git fetch
git reset --hard @{u}
git clean -nd
Run Code Online (Sandbox Code Playgroud)
git clean(将选项替换-nd为-fd实际删除文件:我总是更喜欢在实际删除任何内容之前先预览git clean 将执行的操作)
您必须将它们分组为别名或脚本 ( git-pullreset),然后才能调用。
git stash
git restore -SW -s @{u} -- .
git reset @{u}
Run Code Online (Sandbox Code Playgroud)
那会:
- 保持完全未跟踪的文件(例如:未在 HEAD 或 中跟踪的文件
@{u})保持不变,并且- 会提供一种方法,让某些东西可以恢复到“以前的样子”。
我将采取不同的方法,挑战问题的前提。如果您发现自己必须调整本地分支以匹配远程分支,这表明您不应该从本地分支开始。
\n相反,您所使用的分支是远程跟踪分支,因此无需进行任何调整。
\n以我为例。我一整天都在灵活地制作小功能分支并将它们推送以形成要合并到的拉取请求main。但我自己却没有main。我需要它做什么?没有什么!
fetch然后创建从 开始的分支origin/main。main,我fetch再检查一下origin/main,超脱。fetch然后签出origin/yourbranch,分离。如果在审查期间,作者将更多提交推送到拉取请求分支,我会再次origin/yourbranch获取并签出,分离。因此,我拥有的唯一本地分支是我自己的功能分支 \xe2\x80\x94 ,它们没有上游,无法拉取(也不需要拉取,因为它们中唯一的进一步提交将来自我)。
\n简而言之,我建议,如果人们确实想知道如何“拉取远程分支来覆盖本地分支”作为其常规工作流程的一部分,那么这仅仅表明他们一开始就错误地使用了 Git。你永远不应该建立本地分支机构,除非:
\n这些场景都不会涉及相应的远程跟踪分支,因此问题中提出的情况永远不会出现。
\n| 归档时间: |
|
| 查看次数: |
15064 次 |
| 最近记录: |