Let’s say we have the following situation in Git:
A created repository:
mkdir GitTest2
cd GitTest2
git init
Some modifications in the master take place and get committed:
echo "On Master" > file
git commit -a -m "Initial commit"
Feature1 branched off master and some work is done:
git branch feature1
git checkout feature1
echo "Feature1" > featureFile
git commit -a -m "Commit for feature1"
Meanwhile, a bug is discovered in the master-code and a hotfix-branch is established:
git checkout master
git branch hotfix1
git checkout hotfix1
The bug is fixed in the hotfix branch and merged back into the master (perhaps after a pull request/code review):
echo "Bugfix" > bugfixFile
git commit -a -m "Bugfix Commit"
git checkout master
git merge --no-ff hotfix1
Development on feature1 continues:
git checkout feature1
Say I need the hotfix in my feature branch, maybe because the bug also occurs there. How can I achieve this without duplicating the commits into my feature branch?
I want to prevent to get two new commits on my feature branch which have no relation to the feature implementation. This especially seems important for me if I use pull requests: All these commits will also be included in the pull request and have to be reviewed although this has already been done (as the hotfix is already in the master).
I can not do a git merge master --ff-only
: "fatal: Not possible to fast-forward, aborting.", but I am not sure if this helped me.
This question is related to
git
git-branch
git-merge
git-flow
feature-branch
Complementing the existing answers, as these commands are recurrent we can do it in a row. Given we are in the feature branch:
git checkout master && git pull && git checkout - && git merge -
Or add them in an alias:
alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
I add my answer, similar to others but maybe it will be the quickest one to read and implement.
NOTE: Rebase is not needed in this case.
Assume I have a repo1
and two branches master
and dev-user
.
dev-user
is a branch done at a certain state of master
.
Now assume that both dev-user
and master
advance.
At some point I want dev-user
to get all the commits made in master
.
How do I do it?
I go first in my repository root folder
cd name_of_the_repository
then
git checkout master
git pull
git checkout dev-user
git pull
git merge master
git push
I hope this helps someone else in the same situation.
You might be able to do a "cherry-pick" to pull the exact commit(s) that you need in to your feature branch.
Do a git checkout hotfix1
to get on the hotfix1 branch. Then do a git log
to get the SHA-1 hash (big sequence of random letters and numbers that uniquely identifies a commit) of the commit in question. Copy that (or the first 10 or so characters).
Then, git checkout feature1
to get back onto your feature branch.
Then, git cherry-pick <the SHA-1 hash that you just copied>
That will pull that commit, and only that commit, into your feature branch. That change will be in the branch - you just "cherry-picked" it in. Then, resume work, edit, commit, push, etc. to your heart's content.
When, eventually, you perform another merge from one branch into your feature branch (or vice-versa), Git will recognize that you've already merged in that particular commit, know that it doesn't have to make it again, and just "skip over" it.
Zimi's answer describes this process generally. Here are the specifics:
Create and switch to a new branch. Make sure the new branch is based on master
so it will include the recent hotfixes.
git checkout master
git branch feature1_new
git checkout feature1_new
# Or, combined into one command:
git checkout -b feature1_new master
After switching to the new branch, merge the changes from your existing feature branch. This will add your commits without duplicating the hotfix commits.
git merge feature1
On the new branch, resolve any conflicts between your feature and the master branch.
Done! Now use the new branch to continue to develop your feature.
Based on this article, you should:
create new branch which is based upon new version of master
git branch -b newmaster
merge your old feature branch into new one
git checkout newmaster
resolve conflict on new feature branch
The first two commands can be combined to git checkout -b newmaster
.
This way your history stays clear because you don't need back merges. And you don't need to be so super cautious since you don't need to do a Git rebase.
I am on the feature branch and made refactorings. I want to merge the master changes now to my feature branch. I am far behind. Note I do not want to pull the master changes to my local because my feature branch have modules moved from one place to another. I found just performing below without pull does not work. it says "Already up to date."
//below does not get the latest from remote master to my local feature branch without git pull
git checkout master
git fetch
git checkout my-feature-branch
git merge master
This below works, note use git merge origin/master:
git checkout master
git fetch
git checkout my-feature-branch
git merge origin/master
In Eclipse -
1)Checkout master branch
Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out
2)Pull master branch
Right click on project ->click on Team -> Click on Pull
3)Checkout your feature branch(follow same steps mentioned in 1 point)
4)Merge master into feature
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on merge ->Click on Local ->Click on Master ->Click on Merge.
5)Now you will get all changes of Master branch in feature branch. Remove conflict if any.
For conflict if any exists ,follow this -
Changes mentioned as Head(<<<<<< HEAD) is your change, Changes mentioned in branch(>>>>>>> branch) is other person change, you can update file accordingly.
Note - You need to do add to index for conflicts files
6)commit and push your changes in feature branch.
Right click on project ->click on Team -> Click on commit -> Commit and Push.
OR
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push
You should be able to rebase your branch on master:
git checkout feature1
git rebase master
Manage all conflicts that arise. When you get to the commits with the bugfixes (already in master), Git will say that there were no changes and that maybe they were already applied. You then continue the rebase (while skipping the commits already in master) with
git rebase --skip
If you perform a git log
on your feature branch, you'll see the bugfix commit appear only once, and in the master portion.
For a more detailed discussion, take a look at the Git book documentation on git rebase
(https://git-scm.com/docs/git-rebase) which cover this exact use case.
================ Edit for additional context ====================
This answer was provided specifically for the question asked by @theomega, taking his particular situation into account. Note this part:
I want to prevent [...] commits on my feature branch which have no relation to the feature implementation.
Rebasing his private branch on master is exactly what will yield that result. In contrast, merging master into his branch would precisely do what he specifically does not want to happen: adding a commit that is not related to the feature implementation he is working on via his branch.
To address the users that read the question title, skip over the actual content and context of the question, and then only read the top answer blindly assuming it will always apply to their (different) use case, allow me to elaborate:
git merge master
as in @Sven's answer).Finally, if you're unhappy with the fact that this answer is not the best fit for your situation even though it was for @theomega, adding a comment below won't be particularly helpful: I don't control which answer is selected, only @theomega does.
Here is a script you can use to merge your master branch into your current branch.
The script does the following:
Save this code as a batch file (.bat) and place the script anywhere in your repository. Then click on it to run it and you are set.
:: This batch file pulls current master and merges into current branch
@echo off
:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%
FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)
echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE
git merge
you can follow below steps
origin/master
branch to feature
branch# step1: change branch to master, and pull to update all commits
$ git checkout master
$ git pull
# step2: change branch to target, and pull to update commits
$ git checkout feature
$ git pull
# step3: merge master to feature(?? current is feature branch)
$ git merge master
feature
branch to origin/master
branch
origin/master
is the remote master branch, whilemaster
is the local master branch
$ git checkout master
$ git pull origin/master
$ git merge feature
$ git push origin/master
Source: Stackoverflow.com