Why do so many websites talk about wanting to "avoid merge commits"? Doesn't merging pre-commit or rebasing post-merge make it more difficult to isolate regressions, revert past changes, etc.? Why do so many places talk about a desire to see a linear development history that hides these merge commits? People want to avoid merge commits because it makes the log prettier.
It looks like the centralized logs they grew up with, and locally they can do all their development in a single branch. There are no benefits aside from those aesthetics, and several drawbacks in addition to those you mentioned, like making it conflict-prone to pull directly from a colleague without going through the "central" server.
There will be no merge conflicts, however a bug has been introduced. Luckily, this particular one will get caught on the compilation step, but we're not always so lucky. If the bug manifests as unexpected behaviour, rather than a compile error, we may not find it for a week or two.
At that point, git bisect to the rescue! So when we send off git bisect to find the commit that broke the build, it's going to pinpoint a merge commit. Well, that helps a little, but it's essentially pointing at a package of commits, not a single one.
All ancestors are green. On the other hand, with rebasing, you get a linear history:. Now, git bisect is going to point at the exact feature commit that broke the build. Ideally, the commit message will explain what was intended well enough to do another refactor and fix the bug right away. So pinpointing the exact commit and then being able to examine the commits around it is a great help. That said, I currently still prefer merging.
Rebasing onto a release branch will give you your linear history for use with git bisectwhile retaining the true history for day-to-day work. In short, because merging is often another place for something to go wrong, and it only needs to go wrong once to make people very afraid of dealing with it again once bitten twice shy, if you will.
So, let's say we're working on an new Account Management Screen, and it turns out there is a bug discovered in the New Account workflow. Since we are both dealing with accounts, we've been working with very similar code - perhaps we even had to adjust the same pieces of code.
It only takes a minute to sign up. I am actively working on a two person project with very few longstanding feature branches longest existing branch is 3 weeks. I have spent the afternoon trying to understand merge vs rebase and what the advantages and disadvantages are. I've made some progress and plan on incorporating rebase to clean up my local commits before pushing to github for a code review.
I like to commit often and I have automated testing so it seems like the main argument against rebase that it could introduce bugs to the rebased commits isn't as relevant.
While I've seen some arguments against this type of rebasing it seems less controversial. My confusion is about rebasing vs merging a feature branch into master after the code review is complete. I know that noone else is relying on it and the code review process generated many small meaningless syntax commits. Both of these seem to suggest rebasing.
My understanding is that for my project rebase has the advantage of keeping the history clean which lets me see better summaries in git blame of why a change was introduced. It also helps keep the history linear which makes it easier to use git bisect is it about the history being linear or about having every commit be complete and not intentionally-breaking.
It also allows fixes to my current example where I forgot to rename and edit a file in separate commits before submitting a pull request, leading to a large unnecessary diff. For this project none of these seem like game-changing disadvantages to using the git-merge workflow the codebase might just not be big enough yet to experience the real disadvantages but they would be nice to have if there aren't large cons.
The disadvantages I see are that I'm no git expert and it seems much easier to really break things with rebase than with merge.
Second, we do a lot of active commenting on pull requests in github and I'm hesitant to break or lose those comments by rebasing and changing the SHA on second thought I don't think I'll lose the comments but they'll no longer refer to the correct commits so I would have to hunt down the commits referred to by other means.
Third, it gives the illusion of each commit being a logical complete and working commit when in reality I probably will still have commits that are partially broken. In this article about merge vs rebase they give the following advice about this situation:. Review is done and ready to be integrated into the target branch.GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community. Already on GitHub? Sign in to your account. What commands did you run to trigger this issue? If you can provide a Minimal, Complete, and Verifiable example this will help us understand the issue. Rebase only prints First, rewinding head to replay your work on top of it If the problem was occurring with a specific repository, can you provide the URL to that repository to help us with testing?
Just tried reinstalling Git removing, rebooting, installing with the same settings. The problem persists. Before upgrading to Git 2. I started installing older versions to determine where the issue was introduced. Here's what I've got:. Looks like something have changed between v2. Additionally the change v2.
Reply to this email directly, view it on GitHub, or mute the thread. Yes, the repos I tried this on are public and since this behavior occurred for me for every repo I tried, I believe this is not repo specific. Just as an example, I tried doing a fresh clone of this small repo of mine, ran git rebase immediately after that, and got the same crash.
So I guess this crash is specific to my system rather than to the repo. Not sure how to help debug it further. Do you happen to know how sh. There were some issues on the list where folks who had advance releases had issue that MS then fixed.
There has also been the usual dll adress space layout issues the MS 'rebase' of the dlls [which is totally different from the 'git rebase'] often fixes that. This issue looks like a. Could you try out v2. If that still fails, could you install the portable versions 2. If so, could you replace the latter's msys Yes, the issue is reproducible in portable version 2. The bigger problem now is: the changes between 2.
So the next step is to whittle down the search scope even further, preferably by bisecting. So here is my question: do you time to invest in this search if so, I will describe what to do after installing the SDK?
Thanks for having this fixed! So it starts with First, rewinding head to replay your work on top of it Skip to content. Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.Autostash is a very useful configuration option when using rebase for local changes. Oftentimes, you may need to bring in commits from the upstream branch, but are not ready to commit just yet. However, Git does not allow a rebase to start if the working directory is not clean.
Autostash to the rescue:. The autostash will be applied whenever the rebase is finished. It does not matter whether the rebase finishes successfully, or if it is aborted. Either way, the autostash will be applied. If the rebase was successful, and the base commit therefore changed, then there may be a conflict between the autostash and the new commits. In this case, you will have to resolve the conflicts before committing.
This is no different than if you would have manually stashed, and then applied, so there is no downside to doing it automatically. Git Configuring autostash. Example Autostash is a very useful configuration option when using rebase for local changes.
Probably this could be configured in git itself? I came up with a safe-guard to prevent me from accidentally rewriting history by applying the following advice:. I would like to setup magit in such a way that: [ You shouldn't do that. When you merge a branch into another branch using a merge commit, then the "branch on the right", i. This does not only confuse humans but also tools like git blame. I recommend you simply rebase in this case too. In fact I would argue that it is more important that you do it in this case than in the case in which you already want to use rebase.
Sign up to join this community. The best answers are voted up and rise to the top. Home Questions Tags Users Unanswered. Asked 5 months ago. Active 4 months ago. Viewed 50 times. I currently use pulling with preserving rebase.Keeping Feature Branches Up To Date With Rebasing - Git Workflows
I would like to setup magit in such a way that: this would be used by default for feature branch pushRemote but pulling from develop branch should be done with merge upstream. Active Oldest Votes. No and no. But you already found a workaround which you should probably post as an answer.
Sign up or log in Sign up using Google. Sign up using Facebook. Sign up using Email and Password. Post as a guest Name. Email Required, but never shown.
Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. Master branch has evolved and I mean to have those updates to diverging as little as possible from master branch. Now here I either expect everything to work smoothly or conflicts showing up that I need to resolve before continuing rebase until all master commits are re-applied successfully on feature branch. Now, as much as I can understand he load of conflicts after the pull; I do not understand the need for a pull.
Logically, it should rollback to master when it got branched, save the commits made on the branch, forward to latest commit on master and then apply the saved commits. I do not understand to what the Applying message refers to: what is applying the commits on which version? There is no need to do a git pull after you have rebased your feature branch on top of master. Those commits contain the same changes i. Here's an example.
Let's assume that this is your history before doing git pull on master :. At that point, you rebase feature on top of masterwhich applies D and E :. The solution is to do git pull on both master and feature before rebasing feature on master. However, since you may have commits on feature that you haven't yet pushed to originyou would want to do:.
In light of this commentI expanded on the diverging branches. After rebasing feature on top of masterhistory will look like this:. This is because feature now contains the new commit F from master plus D' and E' read as " D prime " and " E prime " which are commits D and E applied on top of F. Even though they contain the same changes, Git considers them to be different because they have different commit IDs. At this point, you've rewritten history : you've modified existing commits by virtue of rebasing them, effectively creating "new" ones.
However, noticing that D' and E' contain the same changes as D and EGit would just discard them, resulting in a history looking like this:. At this point, git status would tell you this:.
When you rebased your feature branch on top of master, you created a bunch of new commits. This is the situation after the rebase:.
In my opinion, the rebased version has numerous advantages that mostly center around keeping both your code and the history clean, so I'm a little struck by the fact that git does the merge by default. Yes, the hashes of your local commits will get changed, but this seems like a small price to pay for the simpler history you get in return. By no means am I suggesting that this is somehow a bad or a wrong default, though. I am just having trouble thinking of reasons why the merge might be preferred for the default.
Do we have any insight into why it was chosen? Are there benefits that make it more suitable as a default? The primary motivation for this question is that my company is trying to establish some baseline standards hopefully, more like guidelines for how we organize and manage our repositories to make it easier for developers to approach a repository they haven't worked with before.
Subscribe to RSS
I am interested in making a case that we should usually rebase in this type of situation and probably for recommending developers set their global config to rebase by defaultbut if I were opposed to that, I would certainly be asking why rebase isn't the default if it's so great.
So I'm wondering if there is something I'm missing. It discusses the merits of rebase over merge, while this question asks about the benefits of merge over rebase. The answers there reflect this, focusing on problems with merge and benefits of rebase. It is hard to know for sure why merge is the default without hearing from the person who made that decision. Git cannot presume it is ok to --rebase every pull. Listen to how that sounds.
Would you rebase on a pull request? You may pull from upstream and from downstream.
Подписаться на ленту
Some people do a lot of pulling from downstream, from contributors, etc. You may work on features in close collaboration with other developers, pulling from them or from a shared topic branch and still occasionally updated from upstream. If you always rebase then you end up changing shared history, not to mention fun conflict cycles. Git was designed for a large highly distributed team where everyone does not pull and push to a single central repo.