Merge branch 'maint'
* maint: Documentation: Transplanting branch with git-rebase --onto merge-recursive implicitely depends on trust_executable_bit adjust_shared_perm: chmod() only when needed. Fix git-runstatus for repositories containing a file named HEAD
This commit is contained in:
@ -51,20 +51,69 @@ would be:
|
|||||||
D---E---F---G master
|
D---E---F---G master
|
||||||
------------
|
------------
|
||||||
|
|
||||||
While, starting from the same point, the result of either of the following
|
The latter form is just a short-hand of `git checkout topic`
|
||||||
commands:
|
followed by `git rebase master`.
|
||||||
|
|
||||||
git-rebase --onto master~1 master
|
Here is how you would transplant a topic branch based on one
|
||||||
git-rebase --onto master~1 master topic
|
branch to another, to pretend that you forked the topic branch
|
||||||
|
from the latter branch, using `rebase --onto`.
|
||||||
|
|
||||||
would be:
|
First let's assume your 'topic' is based on branch 'next'.
|
||||||
|
For example feature developed in 'topic' depends on some
|
||||||
|
functionality which is found in 'next'.
|
||||||
|
|
||||||
------------
|
------------
|
||||||
A'--B'--C' topic
|
o---o---o---o---o master
|
||||||
|
\
|
||||||
|
o---o---o---o---o next
|
||||||
|
\
|
||||||
|
o---o---o topic
|
||||||
|
------------
|
||||||
|
|
||||||
|
We would want to make 'topic' forked from branch 'master',
|
||||||
|
for example because the functionality 'topic' branch depend on
|
||||||
|
got merged into more stable 'master' branch, like this:
|
||||||
|
|
||||||
|
------------
|
||||||
|
o---o---o---o---o master
|
||||||
|
| \
|
||||||
|
| o'--o'--o' topic
|
||||||
|
\
|
||||||
|
o---o---o---o---o next
|
||||||
|
------------
|
||||||
|
|
||||||
|
We can get this using the following command:
|
||||||
|
|
||||||
|
git-rebase --onto master next topic
|
||||||
|
|
||||||
|
|
||||||
|
Another example of --onto option is to rebase part of a
|
||||||
|
branch. If we have the following situation:
|
||||||
|
|
||||||
|
------------
|
||||||
|
H---I---J topicB
|
||||||
/
|
/
|
||||||
D---E---F---G master
|
E---F---G topicA
|
||||||
|
/
|
||||||
|
A---B---C---D master
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
then the command
|
||||||
|
|
||||||
|
git-rebase --onto master topicA topicB
|
||||||
|
|
||||||
|
would result in:
|
||||||
|
|
||||||
|
------------
|
||||||
|
H'--I'--J' topicB
|
||||||
|
/
|
||||||
|
| E---F---G topicA
|
||||||
|
|/
|
||||||
|
A---B---C---D master
|
||||||
|
------------
|
||||||
|
|
||||||
|
This is useful when topicB does not depend on topicA.
|
||||||
|
|
||||||
In case of conflict, git-rebase will stop at the first problematic commit
|
In case of conflict, git-rebase will stop at the first problematic commit
|
||||||
and leave conflict markers in the tree. You can use git diff to locate
|
and leave conflict markers in the tree. You can use git diff to locate
|
||||||
the markers (<<<<<<) and make edits to resolve the conflict. For each
|
the markers (<<<<<<) and make edits to resolve the conflict. For each
|
||||||
|
@ -1308,6 +1308,7 @@ int main(int argc, char *argv[])
|
|||||||
const char *branch1, *branch2;
|
const char *branch1, *branch2;
|
||||||
struct commit *result, *h1, *h2;
|
struct commit *result, *h1, *h2;
|
||||||
|
|
||||||
|
git_config(git_default_config); /* core.filemode */
|
||||||
original_index_file = getenv("GIT_INDEX_FILE");
|
original_index_file = getenv("GIT_INDEX_FILE");
|
||||||
|
|
||||||
if (!original_index_file)
|
if (!original_index_file)
|
||||||
|
2
path.c
2
path.c
@ -279,7 +279,7 @@ int adjust_shared_perm(const char *path)
|
|||||||
: 0));
|
: 0));
|
||||||
if (S_ISDIR(mode))
|
if (S_ISDIR(mode))
|
||||||
mode |= S_ISGID;
|
mode |= S_ISGID;
|
||||||
if (chmod(path, mode) < 0)
|
if ((mode & st.st_mode) != mode && chmod(path, mode) < 0)
|
||||||
return -2;
|
return -2;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
11
wt-status.c
11
wt-status.c
@ -154,10 +154,8 @@ void wt_status_print_initial(struct wt_status *s)
|
|||||||
static void wt_status_print_updated(struct wt_status *s)
|
static void wt_status_print_updated(struct wt_status *s)
|
||||||
{
|
{
|
||||||
struct rev_info rev;
|
struct rev_info rev;
|
||||||
const char *argv[] = { NULL, NULL, NULL };
|
|
||||||
argv[1] = s->reference;
|
|
||||||
init_revisions(&rev, NULL);
|
init_revisions(&rev, NULL);
|
||||||
setup_revisions(2, argv, &rev, NULL);
|
setup_revisions(0, NULL, &rev, s->reference);
|
||||||
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
||||||
rev.diffopt.format_callback = wt_status_print_updated_cb;
|
rev.diffopt.format_callback = wt_status_print_updated_cb;
|
||||||
rev.diffopt.format_callback_data = s;
|
rev.diffopt.format_callback_data = s;
|
||||||
@ -168,9 +166,8 @@ static void wt_status_print_updated(struct wt_status *s)
|
|||||||
static void wt_status_print_changed(struct wt_status *s)
|
static void wt_status_print_changed(struct wt_status *s)
|
||||||
{
|
{
|
||||||
struct rev_info rev;
|
struct rev_info rev;
|
||||||
const char *argv[] = { NULL, NULL };
|
|
||||||
init_revisions(&rev, "");
|
init_revisions(&rev, "");
|
||||||
setup_revisions(1, argv, &rev, NULL);
|
setup_revisions(0, NULL, &rev, NULL);
|
||||||
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
||||||
rev.diffopt.format_callback = wt_status_print_changed_cb;
|
rev.diffopt.format_callback = wt_status_print_changed_cb;
|
||||||
rev.diffopt.format_callback_data = s;
|
rev.diffopt.format_callback_data = s;
|
||||||
@ -225,10 +222,8 @@ static void wt_status_print_untracked(const struct wt_status *s)
|
|||||||
static void wt_status_print_verbose(struct wt_status *s)
|
static void wt_status_print_verbose(struct wt_status *s)
|
||||||
{
|
{
|
||||||
struct rev_info rev;
|
struct rev_info rev;
|
||||||
const char *argv[] = { NULL, NULL, NULL };
|
|
||||||
argv[1] = s->reference;
|
|
||||||
init_revisions(&rev, NULL);
|
init_revisions(&rev, NULL);
|
||||||
setup_revisions(2, argv, &rev, NULL);
|
setup_revisions(0, NULL, &rev, s->reference);
|
||||||
rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
|
rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
|
||||||
rev.diffopt.detect_rename = 1;
|
rev.diffopt.detect_rename = 1;
|
||||||
run_diff_index(&rev, 1);
|
run_diff_index(&rev, 1);
|
||||||
|
Reference in New Issue
Block a user