我在一个有两个分支a和B的项目上工作。我通常在分支a上工作,并合并分支B中的内容。对于合并,我通常会这样做:
git merge origin/branchB
但是,我也希望保留分支B的本地副本,因为我可能会偶尔检查分支,而不必首先与分支a合并。为此,我会:
git checkout branchB
git pull
git checkout branchA
有没有一种方法可以在一个命令中完成上述操作,而不必来回切换分支?我应该使用gitupdate-ref吗?怎样
我在一个有两个分支a和B的项目上工作。我通常在分支a上工作,并合并分支B中的内容。对于合并,我通常会这样做:
git merge origin/branchB
但是,我也希望保留分支B的本地副本,因为我可能会偶尔检查分支,而不必首先与分支a合并。为此,我会:
git checkout branchB
git pull
git checkout branchA
有没有一种方法可以在一个命令中完成上述操作,而不必来回切换分支?我应该使用gitupdate-ref吗?怎样
当前回答
我为每天在项目中遇到的类似用例编写了一个shell函数。这基本上是一个快捷方式,可以让本地分支机构在打开PR之前保持与公共分支机构的最新状态,如开发等。
即使你不想使用结账,也要发布这个,以防其他人不介意这种限制。
glmh(“git pull and merge here”)将自动签出分支B,拉取最新的分支,重新签出分支A,并合并分支B。
不需要保留branchA的本地副本,但可以通过在签出branchB之前添加一个步骤来轻松修改。类似于。。。
git branch ${branchA}-no-branchB ${branchA}
对于简单的快进合并,这将跳到提交消息提示符。
对于非快速合并,这将使分支处于冲突解决状态(您可能需要进行干预)。
要进行设置,请添加到.bashrc或.zshrc等:
glmh() {
branchB=$1
[ $# -eq 0 ] && { branchB="develop" }
branchA="$(git branch | grep '*' | sed 's/* //g')"
git checkout ${branchB} && git pull
git checkout ${branchA} && git merge ${branchB}
}
用法:
# No argument given, will assume "develop"
> glmh
# Pass an argument to pull and merge a specific branch
> glmh your-other-branch
注意:这不足以将分支名称以外的参数传递给gitmerge
其他回答
git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]
你可以尝试git worktree让两个分支并排打开,这听起来可能是你想要的,但与我在这里看到的其他一些答案非常不同。
通过这种方式,您可以在同一个git repo中有两个单独的分支进行跟踪,因此您只需获取一次即可在两个工作树中获取更新(而不必分别获取两次git clone和git pull)
Worktree将为您的代码创建一个新的工作目录,您可以在其中同时签出不同的分支,而不是在原地交换分支。
当您想要删除它时,可以使用
git worktree remove [-f] <worktree>
如果您想保持与要合并的分支相同的树(即,不是真正的“合并”),可以这样做。
# Check if you can fast-forward
if git merge-base --is-ancestor a b; then
git update-ref refs/heads/a refs/heads/b
exit
fi
# Else, create a "merge" commit
commit="$(git commit-tree -p a -p b -m "merge b into a" "$(git show -s --pretty=format:%T b)")"
# And update the branch to point to that commit
git update-ref refs/heads/a "$commit"
输入git前向合并:
无需签出目标,git forward merge<source><destination>将源合并到目标分支。
https://github.com/schuyler1d/git-forward-merge
仅适用于自动合并,如果存在冲突,则需要使用常规合并。
不,没有。需要签出目标分支,以便解决冲突(如果Git无法自动合并冲突)。
但是,如果合并是一个可以快速进行的合并,则不需要检查目标分支,因为实际上不需要合并任何内容-只需更新分支以指向新的头部引用即可。您可以使用gitbranch-f执行此操作:
git branch -f branch-b branch-a
将更新branch-b以指向branch-a的头部。
-f选项代表--force,这意味着branch-b将被覆盖。
警告:更安全的选择是使用git fetch,它只允许快进。
此方法可按如下方式使用:
git branch -f branch-b branch-b@{Upstream}
或更短
git branch -f branch-b branch-b@{U}
强制更新一个分支,而不检查它(例如,如果它们在重基之后已经分叉)
您可以简单地git将原始分支B拉到分支A中,git将为您完成此操作。