To sum up, don't subvert git just because you want to see a straight line in your commit graph. With a rebase, those intermittent commits are almost useless, as the repo doesn't look like it did when they made that commit. Also, with multi-commit branches, you can see what the repo looked like after each commit. The context in which the developer was working has been lost. You can go to the merge just before the developer's first commit and see what the repo actually looked like when they started work. Reconstructing what a developer did 4 months ago is much simpler with a merge vs a rebase. I've run teams that have used git how you are describing, always making people use rebase (in this case it was because we were syncing to SVN). If you really want a straight-line for your repos, why aren't you using something like SVN? Is the distributed nature of git really the big selling factor? Yes, your repo looks messier, but it more accurately reflects the lifecycle of the code, and what the developer intended at each commit. Git rebase destroys the context of the commit, leaving basically a diff apply instead of the much more contextually rich merge commit. This doesn't show up on a smaller repo, but if you have a busy repo, with lots of contributers, untangling a mess becomes much harder if you no longer have the true parentage of a given commit. The problem with rebase is that it corrupts the true history of the commits. Rebasing local history is OK (it's more than OK, it's sometimes necessary to maintain a clean history), but changing other people commits history is considered a bad practice. I DO NOT encourage rebasing remote (public or shared) branches. NOTE: Because of many discussions about this note. To get to the next batch of conflicts (if you have any). If you want to merge a feature branch it might be wiser to actually merge your commits thus having a single point of integration of two distinct branches.Īlso the conflict resolving will be now per commit basis, not everything-at-once, so you will have to use git rebase -continue The command will apply all your yet-to-be-pushed commits on top of the remote tree commits allowing your commits to be straight in a row and without branches (easier git bisects, yay!).įew notes though. To keep the repository clean, your commits always on top of the tree until you push them to a remote server. You actually issuing git fetch + git merge commands, which will result with an extra commit and ugly merge bubbles in your commit log (check out gitk to see them). What you might not know is that by typing git pull The following is an example of git branch output with some demo branch names.When working on a project you usually synchronize your code by pulling it several times a day. Executing the git branch command will output a list of the local branch refs. The refs for local branches are stored in the. Git keeps remote and local branch commits distinctly separate through the use of branch refs. git/objects directory, Git stores all commits, local and remote. To better understand how git fetch works let us discuss how Git organizes and stores commits. If you have pending changes in progress this will cause conflicts and kick-off the merge conflict resolution flow. git pull is the more aggressive alternative it will download the remote content for the active local branch and immediately execute git merge to create a merge commit for the new remote content. It will download the remote content but not update your local repo's working state, leaving your current work intact. You can consider git fetch the 'safe' version of the two commands. When downloading content from a remote repo, git pull and git fetch commands are available to accomplish the task. This makes fetching a safe way to review commits before integrating them with your local repository. Fetched content has to be explicitly checked out using the git checkout command. Git isolates fetched content from existing local content it has absolutely no effect on your local development work. It’s similar to svn update in that it lets you see how the central history has progressed, but it doesn’t force you to actually merge the changes into your repository. Fetching is what you do when you want to see what everybody else has been working on. The git fetch command downloads commits, files, and refs from a remote repository into your local repo.
0 Comments
Leave a Reply. |