233

私はこのような木を持っています:

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

PROブランチをマスターに移動する必要があります

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

from PROブランチを試しましたgit rebase masterが、何も起こりません。

明確にするために:私はマスターで働いていたので、製品のデモ(git checkout -b demoおよびいくつかのコミット)を作成する必要がありました。次に、誤ってデモ(git checkout -b PROおよびいくつかのコミット)から別のブランチを作成しました。次に、PROブランチをマスターに移動し、デモをそのままにしておく必要があります。最後に、デモとPROの両方がマスターからハングします。

4

6 に答える 6

472

newBaseコミットを移動したいブランチであり、ブランチの古い基盤であると仮定すると、次のようにoldBase使用できます--onto

git rebase --onto newBase oldBase feature/branch

あなたの場合を考えると:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

demo基本的に、以降からを含むすべてのコミットを取得し、PROそれらをコミットにリベースしますmaster

于 2012-06-01T16:20:25.790 に答える
36

私はできる限り一般的になるように努めます。まず、目的のブランチにいることを確認します。

git checkout current-branch

次に、次のコマンドを使用します(ここnew-base-branchで、は新しいベースにしたいcurrent-base-branchブランチであり、は現在のベースであるブランチです)。

git rebase --onto new-base-branch current-base-branch

競合がなければ、すばらしいです。これで完了です。もしそうなら(ほとんどの場合)、それから読んでください。

競合が発生する可能性があり、手動で解決する必要があります。current-branchGitは、current-base-branchとの間で「3方向マージ」を実行しようとしますnew-base-branch。大まかに言って、これはgitが内部でどのように機能するかです。

  1. Gitは最初にcurrent-base-branchを上にリベースしnew-base-branchます。競合が発生する可能性があります。これは手動で解決する必要があります。それが行われた後、あなたは通常、git add .とを行いgit rebase --continueます。このための新しい一時コミットが作成されますtemp-commit-hash

  2. current-branchこの後、Gitはに基づいてリベースしますtemp-commit-hash。さらに競合が発生する可能性があり、再度手動で解決する必要があります。完了したら、とを再度続行しますgit add .git rebase --continueその後、に基づいて正常にリベースしcurrent-branchますnew-base-branch


注:混乱し始めた場合はgit rebase --abort、リベースプロセス中にいつでも実行して、開始点に戻ることができます。

于 2018-03-08T20:16:53.557 に答える
33

ブランチにチェックアウトし、このブランチPROの最も古い(commit4)および最新の(commit5)コミットハッシュをコピーして、別の場所に貼り付けます。

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

ブランチを削除しますPRO(安全のためにバックアップを保管してください)。から新しいPROブランチを作成してチェックアウトしmasterます。

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'

前のブランチのコミットの範囲を新しいブランチに取ります(cherry-pick )。PROPRO

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

ここで、すべて問題がない場合は、強制(-f)プッシュしてremote PROブランチを作成し、ローカルPRO.bacブランチを削除します。

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch
于 2017-09-28T04:41:05.343 に答える
3

ブランチの削除と再作成を回避し、ブランチを切り替える必要をなくす、リセットとスタッシュを使用する少し異なるアプローチがありました。

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

コミットごとにブランチをリセットすることで、基本的には、そのブランチを一度にコミットの履歴を巻き戻すだけです。

于 2018-01-25T20:55:26.203 に答える
0

私はこの質問がかなり古いことを知っていますが、誰かを助ける場合に備えて共有します。

別のベースブランチからPRを発生させ、ベースブランチとリベースを変更すると200以上のファイルの競合が発生したのと同じ状態でした。

それを解決することでさえ、私が望まなかった古いコミットを示していました。だから私がしたのは

  1. ローカルからブランチを削除する
  2. 同じ名前で新しいブランチを作成します。今回は正しいベースブランチを選択してください。
  3. チェリーピックコミットID(ある場合)

最後にコマンドの下で実行しました

git push origin +branchName:branchName

-f上記では、の代わりに使用することもできます+。上記のコマンドは、プルリクエストに影響を与えずにブランチを状態にします。

于 2021-06-07T12:43:18.297 に答える
-4
git branch --set-upstream-to another_branch
于 2021-11-12T17:32:30.090 に答える