You can see all over the web people advising to not use git rebase
in a public branch, but I can't see what's the problem, if you always rebase a feature branch.
My team always uses branches for features (wow), we are used to have it just locally, so rebase isn't a problem, but sometimes we wanna show the code of a partially done feature to another developer, so we just publicize it, but then we lose all of the advantages of git rebase
, or at least that's what you can read at the web.
I don't understand what's the problem, if the developers working at the same public branch never merge it to any branch (when there is still development on that branch) and when they pull it, they do it with a rebase operation. Any changes made to the branch will be always rebase on top of the remote branch, so never lost and you won't have the problem of having the same commit duplicated.
Append 1:
None of the answers until now showed the problems that will happen and how it will happen, so I will try to be clearer.
I will give an example of a workflow using rebase (badly described in the previously paragraphs, sorry) that I don't see any problem.
Initial state:
master ==========A
origin/feature +=====AB
feature user A +=====AB
feature user B +=====AB
master get a few commits and user A does a few commits:
master ==========A=====C
origin/feature +=====AB
feature user A +=====AB====D
feature user B +=====AB
User A does a git pull --rebase
(he always does it) to update his branch, nothing new comes, then he rebase to master and push:
master ==========A=====C
origin/feature +=====ACB'=====ACB'D
feature user A +=====ACB'=====ACB'D
feature user B +=====AB
(notice the B' is the new commits that still represents the changes B)
Then user B does a few commits:
master ==========A=====C
origin/feature +=====ACB'=====ACB'D
feature user A +=====ACB'=====ACB'D
feature user B +=====AB======E
User B finally does a git pull --rebase
as always, there is no need to rebase on master, so he just pushes:
master ==========A=====C
origin/feature +=====ACB'=====ACB'D======E'
feature user A +=====ACB'=====ACB'D
feature user B +=====ACB'=====ACB'D======E'
git pull --rebase
hisB'
will be different from user A'sB'
because each variant of commitB'
contains a commit timestamp which changes respective SHA-1 hash of each commit. If neither user A nor user B never changes any patch and rebase always gets done without conflicts, you can mostly get away with the difference in the SHA-1 as long as you always rebase on top of the master instead of merging into master. If all your git users are aware of the situation, go for it. – Foolhardygit cat-file -p HEAD
for an example). Both can be overridden while creating a commit, but by default for new commits, both have the current time. For rebased commits, "Author" timestamp is kept intact and "Committer" timestamp is set to the time of the rebasing. Unless you use special flags for the rebase, your rebased SHA-1 depends on the time you run the rebase command. – Foolhardy