1
0
mirror of https://github.com/git/git.git synced 2024-11-18 22:23:55 +01:00
Git Source Code Mirror. Please follow Documentation/SubmittingPatches procedure for any of your improvements.
Go to file
Elijah Newren cf65426de6 pull --rebase: Avoid spurious conflicts and reapplying unnecessary patches
Prior to c85c792 (pull --rebase: be cleverer with rebased upstream
branches, 2008-01-26), pull --rebase would run

  git rebase $merge_head

which resulted in a call to

  git format-patch ... --ignore-if-in-upstream $merge_head..$cur_branch

This resulted in patches from $merge_head..$cur_branch being applied, as
long as they did not already exist in $cur_branch..$merge_head.

Unfortunately, when upstream is rebased, $merge_head..$cur_branch also
refers to "old" commits that have already been rebased upstream, meaning
that many patches that were already fixed upstream would be reapplied.
This could result in many spurious conflicts, as well as reintroduce
patches that were intentionally dropped upstream.

So the algorithm was changed in c85c792 (pull --rebase: be cleverer with
rebased upstream branches, 2008-01-26) and d44e712 (pull: support rebased
upstream + fetch + pull --rebase, 2009-07-19).  Defining $old_remote_ref to
be the most recent entry in the reflog for @{upstream} that is an ancestor
of $cur_branch, pull --rebase was changed to run

  git rebase --onto $merge_head $old_remote_ref

which results in a call to

  git format-patch ... --ignore-if-in-upstream $old_remote_ref..$cur_branch

The whole point of this change was to reduce the number of commits being
reapplied, by avoiding commits that upstream already has or had.

In the rebased upstream case, this change achieved that purpose.  It is
worth noting, though, that since $old_remote_ref is always an ancestor of
$cur_branch (by its definition), format-patch will not know what upstream
is and thus will not be able to determine if any patches are already
upstream; they will all be reapplied.

In the non-rebased upstream case, this new form is usually the same as the
original code but in some cases $old_remote_ref can be an ancestor of

   $(git merge-base $merge_head $cur_branch)

meaning that instead of avoiding reapplying commits that upstream already
has, it actually includes more such commits.  Combined with the fact that
format-patch can no longer detect commits that are already upstream (since
it is no longer told what upstream is), results in lots of confusion for
users (e.g. "git is giving me lots of conflicts in stuff I didn't even
change since my last push.")

Cases where additional commits could be reapplied include forking from a
commit other than the tracking branch, or amending/rebasing after pushing.
Cases where the inability to detect upstreamed commits cause problems
include independent discovery of a fix and having your patches get
upstreamed by some alternative route (e.g. pulling your changes to a third
machine, pushing from there, and then going back to your original machine
and trying to pull --rebase).

Fix the non-rebased upstream case by ignoring $old_remote_ref whenever it
is contained in $(git merge-base $merge_head $cur_branch).  This should
have no affect on the rebased upstream case.

Acked-by: Santi BĂ©jar <santi@agolina.net>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-12 21:23:23 -07:00
block-sha1
compat Implement pthread_cond_broadcast on Windows 2010-01-29 19:42:40 -08:00
contrib bash: support 'git am's new '--continue' option 2010-02-12 09:08:17 -08:00
Documentation Git 1.7.0 2010-02-12 15:45:05 -08:00
git_remote_helpers
git-gui Merge git://repo.or.cz/git-gui 2010-02-07 15:52:28 -08:00
gitk-git Merge git://git.kernel.org/pub/scm/gitk/gitk 2010-02-05 21:22:59 -08:00
gitweb gitweb: Simplify (and fix) chop_str 2010-02-03 17:14:00 -08:00
perl
ppc
t pull --rebase: Avoid spurious conflicts and reapplying unnecessary patches 2010-08-12 21:23:23 -07:00
templates
xdiff
.gitattributes
.gitignore Add test-run-command to .gitignore 2010-01-25 09:42:31 -08:00
.mailmap
abspath.c
advice.c
advice.h
alias.c
alloc.c
archive-tar.c
archive-zip.c
archive.c
archive.h
attr.c
attr.h
base85.c
bisect.c
bisect.h
blob.c
blob.h
branch.c
branch.h
builtin-add.c
builtin-annotate.c
builtin-apply.c
builtin-archive.c Merge branch 'maint' 2010-02-07 15:52:12 -08:00
builtin-bisect--helper.c
builtin-blame.c Merge branch 'maint-1.6.5' into maint 2010-02-08 21:53:54 -08:00
builtin-branch.c Merge branch 'jc/branch-d' 2010-01-22 16:08:19 -08:00
builtin-bundle.c
builtin-cat-file.c
builtin-check-attr.c
builtin-check-ref-format.c
builtin-checkout-index.c
builtin-checkout.c Merge branch 'jc/maint-1.6.1-checkout-m-custom-merge' into maint 2010-02-10 12:54:15 -08:00
builtin-clean.c git-clean: fix the description of the default behavior 2010-02-04 15:12:13 -08:00
builtin-clone.c
builtin-commit-tree.c commit-tree: remove unused #define 2010-01-25 09:53:12 -08:00
builtin-commit.c
builtin-config.c Merge branch 'jh/maint-config-file-prefix' into maint 2010-02-10 13:02:05 -08:00
builtin-count-objects.c
builtin-describe.c
builtin-diff-files.c
builtin-diff-index.c
builtin-diff-tree.c
builtin-diff.c
builtin-fast-export.c
builtin-fetch-pack.c
builtin-fetch.c
builtin-fmt-merge-msg.c
builtin-for-each-ref.c
builtin-fsck.c Update git fsck --full short description to mention packs 2010-02-05 13:01:45 -08:00
builtin-gc.c
builtin-grep.c Revert 30816237 and 7e62265 2010-02-05 09:27:25 -08:00
builtin-hash-object.c
builtin-help.c
builtin-index-pack.c
builtin-init-db.c
builtin-log.c Merge branch 'jc/maint-limit-note-output' 2010-01-22 16:08:01 -08:00
builtin-ls-files.c
builtin-ls-remote.c
builtin-ls-tree.c
builtin-mailinfo.c
builtin-mailsplit.c
builtin-merge-base.c
builtin-merge-file.c
builtin-merge-index.c
builtin-merge-ours.c
builtin-merge-recursive.c
builtin-merge-tree.c
builtin-merge.c
builtin-mktag.c
builtin-mktree.c
builtin-mv.c
builtin-name-rev.c
builtin-pack-objects.c Revert "pack-objects: fix pack generation when using pack_size_limit" 2010-02-08 10:56:21 -08:00
builtin-pack-redundant.c
builtin-pack-refs.c
builtin-patch-id.c
builtin-prune-packed.c
builtin-prune.c
builtin-push.c fix off-by-one allocation error 2010-01-29 09:56:12 -08:00
builtin-read-tree.c Merge branch 'jc/fix-tree-walk' 2010-01-24 17:35:58 -08:00
builtin-receive-pack.c
builtin-reflog.c
builtin-remote.c
builtin-replace.c
builtin-rerere.c
builtin-reset.c
builtin-rev-list.c
builtin-rev-parse.c Merge branch 'il/rev-glob' 2010-01-22 16:08:16 -08:00
builtin-revert.c
builtin-rm.c
builtin-send-pack.c
builtin-shortlog.c
builtin-show-branch.c
builtin-show-ref.c
builtin-stripspace.c
builtin-symbolic-ref.c
builtin-tag.c
builtin-tar-tree.c
builtin-unpack-file.c
builtin-unpack-objects.c
builtin-update-index.c
builtin-update-ref.c
builtin-update-server-info.c
builtin-upload-archive.c
builtin-var.c
builtin-verify-pack.c
builtin-verify-tag.c
builtin-write-tree.c
builtin.h
bundle.c
bundle.h
cache-tree.c
cache-tree.h
cache.h Merge branch 'jc/maint-reflog-bad-timestamp' into maint 2010-02-10 13:02:43 -08:00
check_bindir
check-builtins.sh
check-racy.c
color.c
color.h
combine-diff.c
command-list.txt
commit.c Merge branch 'maint-1.6.5' into maint 2010-01-29 23:36:13 -08:00
commit.h Merge branch 'jc/maint-limit-note-output' 2010-01-22 16:08:01 -08:00
config.c
config.mak.in Make NO_PTHREADS the sole thread configuration variable 2010-01-31 11:50:50 -08:00
configure.ac Merge branch 'bw/no-python-autoconf' 2010-02-02 21:48:13 -08:00
connect.c Merge branch 'il/maint-colon-address' 2010-01-27 14:56:42 -08:00
convert.c
copy.c
COPYING
csum-file.c
csum-file.h
ctype.c
daemon.c Merge branch 'il/maint-colon-address' 2010-01-27 14:56:42 -08:00
date.c Merge branch 'jc/maint-reflog-bad-timestamp' 2010-01-27 14:57:37 -08:00
decorate.c
decorate.h
delta.h
diff-delta.c
diff-lib.c Merge branch 'jl/diff-submodule-ignore' 2010-01-26 22:53:13 -08:00
diff-no-index.c
diff.c Merge branch 'jl/diff-submodule-ignore' 2010-01-26 22:53:13 -08:00
diff.h Merge branch 'jc/fix-tree-walk' 2010-01-24 17:35:58 -08:00
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore.h
dir.c
dir.h
editor.c
entry.c
environment.c
exec_cmd.c
exec_cmd.h
fast-import.c fast-import: count --max-pack-size in bytes 2010-02-04 15:12:17 -08:00
fetch-pack.h
fixup-builtins
fsck.c
fsck.h
generate-cmdlist.sh
git-add--interactive.perl
git-am.sh am: switch --resolved to --continue 2010-02-11 22:10:00 -08:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Merge branch 'il/maint-xmallocz' into maint 2010-02-10 13:02:16 -08:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl Merge branch 'gp/maint-cvsserver' 2010-01-28 00:46:33 -08:00
git-difftool--helper.sh Make difftool.prompt fall back to mergetool.prompt 2010-01-22 15:57:45 -08:00
git-difftool.perl
git-filter-branch.sh Merge branch 'maint' 2010-02-11 23:06:32 -08:00
git-instaweb.sh fix portability issues with $ in double quotes 2010-01-26 15:16:54 -08:00
git-lost-found.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh add shebang line to git-mergetool--lib.sh 2010-01-29 09:56:51 -08:00
git-mergetool.sh
git-notes.sh
git-parse-remote.sh
git-pull.sh pull --rebase: Avoid spurious conflicts and reapplying unnecessary patches 2010-08-12 21:23:23 -07:00
git-quiltimport.sh
git-rebase--interactive.sh work around an obnoxious bash "safety feature" on OpenBSD 2010-01-26 19:16:02 -08:00
git-rebase.sh rebase: don't invoke the pager for each commit summary 2010-01-30 08:42:42 -08:00
git-relink.perl
git-repack.sh
git-request-pull.sh
git-send-email.perl
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git-svn.perl git-svn: persistent memoization 2010-02-04 23:33:25 -08:00
GIT-VERSION-GEN Git 1.7.0 2010-02-12 15:45:05 -08:00
git-web--browse.sh
git.c Revert 30816237 and 7e62265 2010-02-05 09:27:25 -08:00
git.spec.in RPM packaging: use %global inside %{!?...} 2010-01-31 11:33:44 -08:00
graph.c
graph.h
grep.c grep: simplify assignment of ->fixed 2010-02-03 12:03:40 -08:00
grep.h Threaded grep 2010-01-26 09:20:07 -08:00
hash.c
hash.h
help.c
help.h
hex.c
http-backend.c
http-fetch.c
http-push.c
http-walker.c
http.c
http.h
ident.c
imap-send.c Merge branch 'maint' 2010-02-08 21:54:10 -08:00
INSTALL
levenshtein.c
levenshtein.h
list-objects.c
list-objects.h
ll-merge.c
ll-merge.h
lockfile.c
log-tree.c
log-tree.h
mailmap.c
mailmap.h
Makefile Merge branch 'jh/gitweb-caching' (early part) 2010-02-02 21:48:22 -08:00
match-trees.c
merge-file.c
merge-recursive.c
merge-recursive.h
name-hash.c
notes.c
notes.h
object.c
object.h
pack-check.c
pack-refs.c
pack-refs.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
pager.c
parse-options.c
parse-options.h
patch-delta.c Fix integer overflow in patch_delta() 2010-01-26 12:57:59 -08:00
patch-ids.c
patch-ids.h
path.c ignore duplicated slashes in make_relative_path() 2010-01-22 15:34:56 -08:00
pkt-line.c
pkt-line.h
preload-index.c Make ce_uptodate() trustworthy again 2010-01-24 00:15:29 -08:00
pretty.c Merge branch 'jc/maint-limit-note-output' 2010-01-22 16:08:01 -08:00
progress.c
progress.h
quote.c Fix invalid read in quote_c_style_counted 2010-02-06 10:55:03 -08:00
quote.h
reachable.c
reachable.h
read-cache.c Correct spelling of 'REUC' extension 2010-02-02 09:54:34 -08:00
README
reflog-walk.c
reflog-walk.h
refs.c
refs.h
RelNotes Git 1.6.6.2 2010-02-10 13:44:11 -08:00
remote-curl.c
remote.c
remote.h
replace_object.c
rerere.c rerere: fix too-short initialization 2010-01-28 09:30:14 -08:00
rerere.h
resolve-undo.c build: make code "-Wpointer-arith" clean 2010-02-01 22:04:03 -08:00
resolve-undo.h build: make code "-Wpointer-arith" clean 2010-02-01 22:04:03 -08:00
revision.c Fix log -g this@{upstream} 2010-01-26 13:49:50 -08:00
revision.h
run-command.c
run-command.h
send-pack.h
server-info.c
setup.c
sha1_file.c Merge branch 'il/maint-xmallocz' 2010-01-27 14:56:38 -08:00
sha1_name.c reject @{-1} not at beginning of object name 2010-01-28 12:12:50 -08:00
sha1-lookup.c
sha1-lookup.h
shallow.c
shell.c
shortlog.h
show-index.c
sideband.c
sideband.h
sigchain.c
sigchain.h
strbuf.c
strbuf.h
string-list.c
string-list.h
submodule.c Fix memory leak in submodule.c 2010-01-31 10:25:23 -08:00
submodule.h Teach diff --submodule that modified submodule directory is dirty 2010-01-24 21:04:31 -08:00
symlinks.c
tag.c
tag.h
tar.h
test-chmtime.c
test-ctype.c
test-date.c
test-delta.c
test-dump-cache-tree.c
test-genrandom.c
test-index-version.c
test-match-trees.c
test-parse-options.c
test-path-utils.c
test-run-command.c
test-sha1.c
test-sha1.sh
test-sigchain.c
thread-utils.c
thread-utils.h
trace.c
transport-helper.c
transport.c transport_get(): drop unnecessary check for !remote 2010-01-27 12:22:37 -08:00
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unimplemented.sh
unpack-trees.c Merge branch 'jc/fix-tree-walk' 2010-01-24 17:35:58 -08:00
unpack-trees.h Merge branch 'jc/fix-tree-walk' 2010-01-24 17:35:58 -08:00
upload-pack.c
usage.c
userdiff.c
userdiff.h
utf8.c
utf8.h
walker.c
walker.h
wrap-for-bin.sh
wrapper.c Add xmallocz() 2010-01-26 12:57:53 -08:00
write_or_die.c
ws.c
wt-status.c Merge branch 'jl/submodule-diff' 2010-01-22 16:08:10 -08:00
wt-status.h
xdiff-interface.c
xdiff-interface.h

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.

Git is an Open Source project covered by the GNU General Public License.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.

See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands, and
Documentation/git-commandname.txt for documentation of each command.
If git has been correctly installed, then the tutorial can also be
read with "man gittutorial" or "git help tutorial", and the
documentation of each command with "man git-commandname" or "git help
commandname".

CVS users may also want to read Documentation/gitcvs-migration.txt
("man gitcvs-migration" or "git help cvs-migration" if git is
installed).

Many Git online resources are accessible from http://git-scm.com/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org. To subscribe
to the list, send an email with just "subscribe git" in the body to
majordomo@vger.kernel.org. The mailing list archives are available at
http://marc.theaimsgroup.com/?l=git and other archival sites.

The messages titled "A note from the maintainer", "What's in
git.git (stable)" and "What's cooking in git.git (topics)" and
the discussion following them on the mailing list give a good
reference for project status, development direction and
remaining tasks.