git checkout custom_branch && git rebase master
This will update custom_branch with changes from master branch.
Don't forget to make sure master is up to date first. git pull
This is also possible with git checkout custom_branch && git merge master
For an explanation on why the first one is (probably) what you should be using: When do you use git rebase instead of git merge? Answer from tehp on Stack Overflow
git checkout custom_branch && git rebase master
This will update custom_branch with changes from master branch.
Don't forget to make sure master is up to date first. git pull
This is also possible with git checkout custom_branch && git merge master
For an explanation on why the first one is (probably) what you should be using: When do you use git rebase instead of git merge?
git switch custom_branch # switch current working environment to custom_branch
git merge master # merge master branch into custom_branch
This will update your current branch with the changes from your local master branch, the state of which will be that of when you last pulled while on that branch.
I think this is what you are looking for: git merge origin master
How I would do this
git checkout master
git pull origin master
git merge test
git push origin master
If I have a local branch from a remote one, I don't feel comfortable with merging other branches than this one with the remote. Also I would not push my changes, until I'm happy with what I want to push and also I wouldn't push things at all, that are only for me and my local repository. In your description it seems, that test is only for you? So no reason to publish it.
git always tries to respect yours and others changes, and so will --rebase. I don't think I can explain it appropriately, so have a look at the Git book - Rebasing or git-ready: Intro into rebasing for a little description. It's a quite cool feature
This is a very practical question, but all the answers above are not practical.
Like
git checkout master
git pull origin master
git merge test
git push origin master
This approach has two issues:
It's unsafe, because we don't know if there are any conflicts between test branch and master branch.
It would "squeeze" all test commits into one merge commit on master; that is to say on master branch, we can't see the all change logs of test branch.
So, when we suspect there would some conflicts, we can have following git operations:
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
Test merge before commit, avoid a fast-forward commit by --no-ff,
If conflict is encountered, we can run git status to check details about the conflicts and try to solve
git status
Once we solve the conflicts, or if there is no conflict, we commit and push them
git commit -m 'merge test branch'
git push
But this way will lose the changes history logged in test branch, and it would make master branch to be hard for other developers to understand the history of the project.
So the best method is we have to use rebase instead of merge (suppose, when in this time, we have solved the branch conflicts).
Following is one simple sample, for advanced operations, please refer to http://git-scm.com/book/en/v2/Git-Branching-Rebasing
git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test
Yep, when you have uppers done, all the Test branch's commits will be moved onto the head of Master branch. The major benefit of rebasing is that you get a linear and much cleaner project history.
The only thing you need to avoid is: never use rebase on public branch, like master branch.
Never do operations like the following:
git checkout master
git rebase -i test
Details for https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
appendix:
- if you are not sure about rebasing operations, please refer to: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
edit: this is talking about making a PR if that isn't clear my bad
Assuming history doesn't matter/squash.
I find it much easier to:
-
clean up my dev branch/commit
-
checkout master
-
pull down latest master
-
checkout my dev branch again
-
do
$git merge master
I do this because I've found the rebase method I had to go through each commit... possibly deal with conflicts more than once(per commit).
I need advice on how to merge master into a feature branch.
I began working on a new feature last year, and then was pulled away to other things. Master had substantially changed, so I wanted to merge it back into the feature branch, because I can't keep working on the feature until those changes are incorporated into that branch.
I tried this in Github, but I could only merge into master, even when I selected merge into the feature branch. I finally just merged into master and manually updated the changes on the feature branch (which had been overwritten) through cut-and-paste on the feature branch. But this seems like a common task, and I don't want to have to do that again if I can help it.
Thanks in advance for any help; I did consult the Git book, but I couldn't find anything specific about this task.
0
I have very basic question and am very novice to GIT. Hence, my question is below.
I have "Master" as base branch where my code files and folders are. Now, I have 5 teammates, and they have created 5 branches separately to work on different folders cloning the masters. Now, my question is - I created some changes in folder xyz in my branch abc123. Now, I need to push my changes from abc123 branch and merge to Master. If I merge, then master repo will be updated with new changes. Now, my concern is that what if other teammates push their changes in to master working different folder called abc but in their cloned one in their branch there would be previous content of xyz content. will that previous content from his branch replace my updated one in master?
You can certainly branch off of any branch. If your refactor branch is long-lived, and you need to add a new feature based off it the work you've already done, create feature2 off the refactor branch.
However, those 2 branches are intertwined now. You'll need to regularly pull from refactor into feature2 (in addition to pulling from main into refactor). Your PR from feature2 into refactor will only reflect the diffs between those 2 branches, but when you open a PR from refactor into main you will get see diffs from feature2 as well - something to keep in mind for whoever is reviewing.
In order for the feature2 PR to be as clean as possible, the changes you make in feature2 should be completely unrelated to the changes you're making in refactor. When you start changing the same functions in the same files on the two branches, that means conflicts. Given your use-case though (the feature depends on the work you're doing in the refactoring) this may be unavoidable.
Given all that, I'd caution about having such a long-lived branch (refactor) that you are doing other development on (feature2) at the same time. If this is truly a refactoring, adding in new features can complicate the determination that the refactoring was successful (is a bug due to the refactor or the new feature). So while it is possible to branch off of your refactoring branch, I'd evaluate whether you really want to do that, or focus on wrapping up the refactoring first.
Use git rebase to move the branches (refactor and feature) when work happens on the other branches (main and refactor) and finally when refactoring is merged. You can also move the commits from refactor that you need in feature to the base and first merge those into main rebasing refactor and feature on the merge of those changes.
Given new changes in refactor do:
git switch feature;
git rebase refactor...feature --onto refactor
Graphically you are doing. From:
* Refactor: new changes feature should be rebased on these
| * Feature
| * a commit in Feature
|/
* Fearure...Refactor (common base of Feature and Refactor)
* a commit in Refactor
* Main: before starting refactorring
To:
* Feature
* a commit in feature
* Refactor: new changes feature should be rebased on these
* this was the common base now it's just a commit
* a commit in Refactor
* Main: before starting refactoring
For changes in Main you rebase in two steps first Refactor onto Main then Feature onto the moved Refactor. Make sure to remember the hash of the base of feature (on create a tempoeary branch for it):
git branch tmp/feature-base feature...refactor;
git switch refactor;
git rebase refactor...main --onto main;
git switch feature;
git rebase tmp/feature-base --onto refactor;
git branch -D tmp/feature-base;
Graphically from:
* Main: new changes both branches should have these
| * Feature
| * a commit in Feature
| * tmp/feature-base, Refactor
| * a commit in Refactor
|/
* Refactor...Main: before starting refactoring
Intermediate:
* Refactor
* a commit in refactor
* Main: new changes both branches should have these
| * Feature
| * a commit in Feature
| * tmp/feature-base: this commit is no longer is the refactor branch but it is in the history of Feature
| * a commit in Refactor
|/
* before starting refactoring
To:
* Feature
* a commit in Feature
* Refactor
* a commit in refactor
* Main: new changes both branches should have these
* before starting refactoring
Once Refactor is merged into main rebase Feature onto the merge commit, this leads to a semi linear history with features visible and small commits that tell a story about why the code is as.
* Feature
* a commit on feature
* merge refactor into main
|\
| * Refactor
| * a commit in refactor
|/
* before starting refactoring
Don't be affraid of rebasing or merge conflicts.