Reputation: 6846
I have an old branch, which I would like to delete. However, before doing so, I want to check that all commits made to this branch were at some point merged into some other branch. Thus, I'd like to see all commits made to my current branch which have not been applied to any other branch [or, if this is not possible without some scripting, how does one see all commits in one branch which have not been applied to another given branch?].
Upvotes: 622
Views: 322949
Reputation: 11688
To see a list of which commits are on one branch but not another, use git log:
git log --no-merges oldbranch ^newbranch
...that is, show commit logs for all commits on oldbranch that are not on newbranch. You can list multiple branches to include and exclude, e.g.
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
Note: on Windows command prompt (not Powershell) ^
is an escape key, so it needs to be escaped with another ^
:
git log --no-merges oldbranch ^^newbranch
Upvotes: 765
Reputation: 52659
I'd like to count the commits too, so here's how to do that:
Count how many commits are on the current branch (HEAD
), but NOT on master
:
git log --oneline ^master HEAD | wc -l
wc -l
means "word count"--count the number of 'l'ines.
And of course to see the whole log messages, as other answers have given:
git log ^master HEAD
...or in a condensed --oneline
form:
git log --oneline ^master HEAD
If you don't want to count merge commits either, you can exclude those with --no-merges
:
git log --oneline --no-merges ^master HEAD | wc -l
etc.
Upvotes: 4
Reputation: 1729
Show commits and commit contents from other-branch
that are not in your current branch:
git show @..other-branch
Additionally you can apply the commits from other-branch
directly to your current branch:
git cherry-pick @..other-branch
Upvotes: 3
Reputation: 323464
If it is one (single) branch that you need to check, for example if you want that branch 'B' is fully merged into branch 'A', you can simply do the following:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
has the safety that "The branch must be fully merged in HEAD."
Caution: this actually deletes the branch B if it is merged into A.
Upvotes: 8
Reputation: 5629
To show the commits in oldbranch but not in newbranch:
git log newbranch..oldbranch
To show the diff by these commits (note there are three dots):
git diff newbranch...oldbranch
Here is the doc with a diagram illustration https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
Upvotes: 130
Reputation: 1029
While some of the answers posted here will help find what you seek, the following sub-command of git branch is a more suitable solution for your task.
While in master
one could run the command to enumerate the branches one could safely remove, like so:
git branch --merged
develop
fpg_download_links
* master
master_merge_static
# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static
# There is also a flag to specify remote branches in the output
git branch --remotes --merged
Upvotes: 52
Reputation: 5101
For those still looking for a simple answer, check out git cherry. It compares actual diffs instead of commit hashes. That means it accommodates commits that have been cherry picked or rebased.
First checkout the branch you want to delete:
git checkout [branch-to-delete]
then use git cherry to compare it to your main development branch:
git cherry -v master
Example output:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
Note: The -v
flag is to include the commit message along with the SHA hash.
Lines with the '+' in front are in the branch-to-delete, but not the master branch. Those with a '-' in front have an equivalent commit in master.
For JUST the commits that aren't in master, combine cherry pick with grep:
git cherry -v master | grep "^\+"
Example output:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
Upvotes: 81
Reputation: 280
jimmyorr's answer does not work on Windows. it helps to use --not
instead of ^
like so:
git log oldbranch --not newbranch --no-merges
Upvotes: 22
Reputation: 90980
You probably just want
git branch --contains branch-to-delete
This will list all branches which contain the commits from "branch-to-delete". If it reports more than just "branch-to-delete", the branch has been merged.
Your alternatives are really just rev-list syntax things. e.g. git log one-branch..another-branch
shows everything that one-branch
needs to have everything another-branch
has.
You may also be interested in git show-branch
as a way to see what's where.
Upvotes: 364
Reputation: 1475
You can use this simple script to see commits that are not merged
#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
# git branch-notmerge <branchname>
#
# Setup git alias
# git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')
You can use also tool git-wtf that will display state of branches
Upvotes: 3