web-dev-qa-db-ja.com

切り離されたヘッドで行われたコミットの処理

Gitを使用して、私はこのようなものを作りました

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on Origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

頭が離れた状態でもコミットできると言っていたので、そうしました。しかし、今では、分離したヘッドブランチとローカルマスターブランチをマージしてから、変更の束をOrigin/masterにプッシュします。

だから私の質問は、どのようにマスターブランチを実際の状態(ヘッドの分離)とマージすることができますか

227
benzen

現在の場所にブランチを作成し、マスターに切り替えてマージします。

git branch my-temporary-work
git checkout master
git merge my-temporary-work
397
Ryan Stewart

このようなことができます。

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temproary branch
git branch -d tmp

さらにシンプルになります

git checkout master
git merge HEAD@{1}

しかし、これには、間違えた場合に、切り離されたヘッドで行われたコミットを回復するのが少し難しくなるというわずかな危険があります。

77
CB Bailey

git merge <commit-number>またはgit cherry-pick <commit> <commit> ...を実行するだけです

Ryan Stewartが提案したように、現在のHEADからブランチを作成することもできます。

git branch brand-name

または単なるタグ:

git tag tag-name
17
Arnaud Le Blanc

これは私がやったことです:

基本的に、detached HEADは名前のない新しいブランチと考えてください。他のブランチと同様に、このブランチにコミットできます。コミットが完了したら、リモートにプッシュします。

したがって、最初に行う必要があるのは、このdetached HEADに名前を付けることです。このdetached HEADにいる間は、次のように簡単に実行できます。

git checkout -b some-new-name

これで、他のブランチと同様にリモートにプッシュできます。

私の場合、detached HEAD(現在はsome-new-branch)で行ったコミットとともに、このブランチをマスターに早送りしたかったのです。私がしたのは

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

もちろん、後でmasterにマージしました。

それについてです。

12
Bhushan

デタッチされたHEADの場合、コミットは通常のように機能しますが、名前付きブランチは更新されません。コミットされた変更でマスターブランチを更新するには、現在の場所に一時ブランチを作成し(この方法で一時ブランチは、デタッチされたHEADでコミットされたすべての変更を保持します)、マスターブランチに切り替えて一時ブランチをマージしますマスター。

git branch  temp
git checkout master
git merge temp
6
Razan Paul

簡単な修正方法は、そのコミットとチェックアウト用の新しいブランチを作成することです:git checkout -b <branch-name> <commit-hash>

この方法で、行ったすべての変更がそのブランチに保存されます。マスターブランチを残りのコミットからクリーンアップする必要がある場合は、必ずgit reset --hard masterを実行してください。

これにより、ブランチを書き直すことになりますので、これらの変更で誰かを邪魔しないようにしてください。 detached HEAD 状態のより良い例については、この記事を必ずご覧ください。

2
Nesha Zoric

また、処理方法を説明した記事を作成しました。提案されたものとは少し異なるため、追加します。しかし、私はすべての命題が有効だと思います

http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html

後で最初の答えを良いものとして受け入れます

1
benzen

最善の解決策ではないかもしれませんが(履歴を書き換えます)、git reset --hard <hash of detached head commit>を実行することもできます。

1
rookie