Git を使用して、作業コピーの変更を別のブランチにコミットするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1840898

  •  12-09-2019
  •  | 
  •  

質問

私はブランチで働いていますが、非常に汚れた作業コピーを入手しました。コミットする変更を確認するときに、いくつかのワンライナー修正を master 支店。

この場合、使用すると、 git stash 私の作業コピーにはまだマスターとマージされない他の多くの変更があるため、実際には役に立ちません。

この状況を解決するより効率的な方法はありますか?(例えば。コミットを作成して、その親を移動しますか?)

役に立ちましたか?

解決 5

以前の提案に基づいて、これが私が思いついた解決策です。

チェリーピックによる解決策 1

ブランチ自体で 1 つの変更をコミットするだけです。

git add --patch <files>      # record every change to move to master
git commit

マスターに移動し、チェリーピックする

git stash
git checkout master
git cherry-pick <commitid>

ブランチに戻って、リベースできます。

git checkout <branch>
git rebase master

重複したコミットごとに、次のように入力するように求められます。

git rebase --skip

重複したコミットはブランチ内のパッチセットから除外され、履歴はクリーンになります。最終 git merge 結局のところ、まだ早送りすることができます。

解決策 2、最初にブランチでコミットする必要がない

まず、マスターに移動するすべてを抽出します。

git add --patch <files>      # record every change to move to master

次に、マスターに切り替えてコミットします。

git stash --keep-index       # clear the working copy only
git checkout master -m       # merge the index.
git commit

ブランチに戻ると、マスターの先端に直接リベースできます。

git checkout <branchname>
git rebase master            # move to branch start to the tip of master.
git stash apply              # restore working copy, auto merges the changes

解決策 3、現在の master ブランチのクローンを作成する

複数の作業コピーがあっても構わない場合 (実際には私は常に SVN を使用してこれを行っていました)、3 番目の解決策があります。

mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master  # fetch remote master to local remotes/origin/master
git checkout -t origin/master           # make new "master" branch, link to remote, checkout.

git commit
git push origin master                  # inject the change in the original repository.

クローンのセットアップはここでは手動で行われます。 git clone 常に現在アクティブなブランチのクローンを作成します。


より複雑な状況では、常に追加の安全装置が用意されています。 git diff > to-master.patch そして git apply to-master.patch. 。これにより、より自由にすべてをリセットし、正しくなるまでやり直すことができます。

この状況では、両方のブランチに存在するファイル内の 1 行の修正を扱っています。これによりマージ競合が発生せず、次のようなショートカットが可能になります。 checkout -m.

他のヒント

あなたは使用する git add -i に使用することができます対話モード。そこには、何をコミットすると何スキップするを指定することができます。

この方法は、あなたが別々のコミットとしてあなたonelinersをコミットすることができます。 git cherry-pickするを使用することにより、あなたはそれらをマージすることができますあなたのマスターに、後でます。

残りを習得し、コミットする変更、その後、あなたはこのブランチにコミットしたいものを選択する

使用git add -iます。

add -iを使用すると、そのコミットのうち、同じファイルの他の部分を残しながら、あなたは、コミットし、それらをコミットするために準備をしたいどのファイルの一部を選択することができます。

git add -pは、@ arkaitz-ヒメネスが正しく推奨していますプロセスに従うことが、パッチ・モードに直接あなたをドロップします。

これはあなたが望むものであるならば、私は知らないが、私はちょうど(コミットされていない変更を失うことはありません)他のブランチをチェックアウトした後、選択的にコミットする変更をチェックインします。

その代わりgit add -i / git add -pを使用してのあなたもgit gui
(cludeにあり、おそらく他のgitのグラフィカルインタフェースは、この機能を持って、例えばQGitのように、ツールをコミット)

のインタラクティブ追加モードを使用することができます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top