Answers:
git branch --merged master
列出合并到母版中的分支
git branch --merged
列出合并到HEAD中的分支(即当前分支的尖端)
git branch --no-merged
列出尚未合并的分支
默认情况下,这仅适用于本地分支。该-a
标志将显示本地和远程分支,并且-r
标志仅显示远程分支。
git branch -a --merged/no-merged
它也可以工作,而无需在该过程中创建本地跟踪分支。
git branch -r --merged/--no-merged
为了找到远程分支。
--merged/--no-merged
它后面有一个可选的commit参数。至少在我的git(1.9.1)版本中,在它之后添加-a
or -r
标志会给我带来致命错误。添加-a
或-r
之前 --(no-)merged
。
您可以使用git merge-base
命令查找两个分支之间的最新公共提交。如果该提交与您的分支头相同,则分支已完全合并。
需要注意的是
git branch -d
做这样的事情已经因为它会拒绝删除该分支还没有已经完全合并。
git branch -d
将拒绝删除尚未合并到当前分支中的分支。不删除当前分支。
还有一个图形界面解决方案。只需输入
gitk --all
一个新的应用程序窗口将提示您整个仓库的图形表示,在这里很容易意识到分支是否已合并
git
客户端的应用程序。在Ubuntu上,apt-get install gitk
。
brew install git-gui
,以进入gitk
命令行。
我正在使用以下bash函数,例如: git-is-merged develop feature/new-feature
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2
merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)
if [[ $merge_base = $merge_source_current_commit ]]
then
echo $merge_source_branch is merged into $merge_destination_branch
return 0
else
echo $merge_source_branch is not merged into $merge_destination_branch
return 1
fi
}
使用git merge-base <commit> <commit>
。
该命令在两次提交之间找到最佳的共同祖先。并且如果公共祖先与“分支”的最后一次提交相同,那么我们可以放心地假定“分支”已经合并到母版中。
步骤如下
git merge-base <commit-hash-step1> <commit-hash-step2>
。 有关git merge-base https://git-scm.com/docs/git-merge-base的更多信息。
master
已合并到中branch
,然后又向中添加了4个提交branch
。
git log -1 $(git merge-base base-branch feature-branch)
如果feature-branch
在输出中看到,那么您知道它们已合并?
关于清理远程分支机构的主题
git branch -r | xargs -t -n 1 git branch -r --contains
此列表列出了每个远程分支,然后列出了其最新SHA所在的远程分支。
这对于辨别哪些远程分支已被合并但未被删除,以及哪些远程分支尚未被合并从而正在衰减非常有用。
如果您使用的是“ tig”(类似于gitk,但基于终端),则可以
tig origin/feature/someones-decaying-feature
无需git checkout即可查看分支的提交历史记录
为了验证哪些分支合并到master,您应该使用以下命令:
git branch <flag[-r/-a/none]> --merged master
合并到master的所有分支的列表。git branch <flag[-r/-a/none]> --merged master | wc -l
合并到master的所有分支的数量。标志是:
-a
标志- (全部)显示远程和本地分支-r
标志- (远程)仅显示远程分支<emptyFlag>
- 仅显示本地分支机构例如: git branch -r --merged master
将向您显示所有合并到主数据库的远程存储库。
这是我需要确定分支是否已合并的技术,即使该分支可能已被重新建立基础以与我们的主分支保持最新,这是功能分支的常见情况。
这两种方法都不是简单的证明,但是我发现它们非常有用。
使用诸如gitk或TortoiseGit之类的可视工具,或者仅使用--all进行git log,浏览历史记录以查看到主分支的所有合并。您应该能够发现此特定功能分支是否已合并。
如果您习惯于在合并功能分支时始终删除本地分支和远程分支,那么您只需在另一台计算机上更新和修剪远程对象,功能分支就会消失。
为了帮助您记住这一点,我已经在使用git flow扩展(AVH版)在本地创建和合并功能分支,因此我添加了以下git flow钩子,询问我是否还希望自动删除远程分支。
示例创建/完成特征分支
554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'
Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$
.git / hooks / post-flow-feature-finish
NAME=$1
ORIGIN=$2
BRANCH=$3
# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] )
echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
git push $2 :$3;
break;;
[Nn] )
echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
break;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
# Stop reading user input (close STDIN)
exec <&-
exit 0
如果您不总是删除远程分支,则仍可以搜索类似的提交以确定分支是否已合并。这里的陷阱是,如果远程分支已被重新建立为无法识别的基础,例如压缩提交或更改提交消息。
master分支上的示例命令:
gru
gls origin/feature/foo
glf "my message"
在我的bash .profile配置中
alias gru='git remote update -p'
alias glf=findCommitByMessage
findCommitByMessage() {
git log -i --grep="$1"
}
git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
git log
您还可以添加--merges
以仅显示合并提交。stackoverflow.com/a/25986615/134761
这是一个简单的方法,它可以让您知道当前分支是否合并了远程原始/主分支的数据或该数据不在其中:
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
在功能分支上工作时,我经常遇到这个问题,并且经常想确保将最新的工作整合到自己的独立工作分支中。
为了概括该测试,我在〜/ .gitconfig中添加了以下别名:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
然后我可以打电话给:
$ git current origin/master
检查我是否最新。
git branch --merged
然后删除了本地和远程分支。