6

機能ブランチを 2 回目にプッシュするときに、次のメッセージが表示されないようにするにはどうすればよいですか。

To https://github.com/xxx/git_test.git
! [rejected]        feature_branch -> feature_branch (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxx/git_test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

私がすることはこれです:

git pull origin sprint_branch1
git checkout -b feature_branch

date > a.txt
git add a.txt 
git commit -m 'added date'

git push origin feature_branch

誰かが私の機能のコード レビューを行い、他の誰かがその間に sprint_branch に変更を加えます:

git checkout sprint_branch1
date > a.txt 
git add a.txt 
git commit -m 'added another date'
git push origin sprint_branch1

機能を改善する必要があるので、そうします

git checkout feature_branch
git fetch origin
git rebase origin/sprint_branch1

マージの競合が発生し、次のことを行います。

nano a.txt # removing inserted merge tags
git add a.txt 
git rebase --continue

それから私は自分の機能を改善します

date >> a.txt 
git add a.txt 
git commit -m 'add another date again'

2 回目のレビューのために自分の feature_branch をプッシュしたい

git push origin feature_branch

ただし、上部に記載されているエラーメッセージが表示されます。Git は git pull の使用を推奨していますが、他の人は rebase ワークフローの使用を推奨しています。では、feature_branch をプッシュするにはどうすればよいでしょうか? feature_branch_v2 という名前の新しいブランチを作成してプッシュする必要がありますか? その場合、どのファイルを git に追加するかを手動で覚えておく必要がありますか、それともすべてを追加する必要がありますか (厄介なコミットを作成します)? このエラー メッセージを表示せずにプッシュするより良い方法はありますか?

4

2 に答える 2

8

これはあなたが間違ったところです:

git rebase origin/sprint_branch1

公開されたブランチをリベースしないでください。このコマンドは

git merge origin/sprint_branch1

一般的に注意が必要git rebaseです。非常に危険なツールですが、その周りにはある種の宗教があるようです。

どのように進めることができますか?

  • 他の誰も機能ブランチに再び触れず、最後のプル以降誰も変更を加えていないことが絶対に確実な場合は、次のようにすることができます

    git push -f
    

    これにより、サーバー上の HEAD があなたの HEAD で上書きされます。

  • 前回のプルから変更がなかったと確信しているが、他の人があなたのブランチを使用している場合は、上記の手順を実行して、ブランチのコピーを全員に実行する必要があることを伝えることができます。

    git fetch origin
    git checkout feature_branch
    git reset --hard origin/feature_branch
    

    ただし、最後のプッシュ以降のローカルの変更はすべて消去されます。

  • 最も安全な方法は、ローカルの名前をfeature_branch他の何かに変更し、追加したコミット、現在のブランチ、origin/feature_branchおよびcherry-pickすべての変更を見つけることです。

gitk feature_branch origin/feature_branch何が起こっているのかを理解するために実行します。

于 2013-07-28T12:07:34.487 に答える
2

ギットは言う

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.

コミットを行った後、リベース ワークフローを使用してリモート ブランチからリベースをプルし、リモートにプッシュする必要がある場合があります。

git commit -m 'add another date again'
git pull --rebase

これにより、リベースの競合が発生する可能性があり、解決してからリベースを続行する必要があります。これは主に、sprint_branch1 のツリーのバージョンが feature_branch より遅れていることが原因です。

正しいコミットも行われていることを確認する必要があります。一般的な意味で、sprint_branch1 とマージするときは、

git checkout feature_branch
git merge sprint_branch1

リベースはコミットを書き換えて問題を引き起こす可能性があるため、リベースの代わりにこれを使用します。プッシュするだけでマージした後は、正常に動作するはずです。

編集1:

リベースする必要があり、それでもこのエラーを回避する必要がある場合は、次を使用できます

git push --force origin feature_branch

ただし、他の人がプッシュした可能性のある変更に関係なく、リモート ブランチがローカル ブランチで書き換えられるため、特に分散チームではお勧めできません。

于 2013-07-28T09:24:48.800 に答える