進行中のコミットが突然、まだ存在していない別のコミットに依存しているように見える場合の対処方法


13

私はGitに不慣れですが、Gitに慣れるために最善を尽くし、これまでのところ、私が単独で取り組んでいるプロジェクトにそれを使用しています。

私がコーディングするとき、自然に(将来を知ることができないので)いくつかのトップダウンアプローチがあり、繰り返し発生するテーマがあります。

私はいくつかの仕事をします。
自分の仕事を「コミット可能な」何かにするためには、他の仕事をする必要があることがわかります。
他の仕事は、それ自身のコミットに値する。

コミット可能なものとは、コンパイルするもの、または完全に混乱しないものを意味します。
そして、それが自分のコミットに値するものによって、私はコミットがただ一つのことをするべきだということを学んだことを言っています。

解決方法は面倒です。他の作業が別のファイルにある場合、新しいブランチを作成し、そこでコミットしてマージします。作業が同じファイルにある場合.. ugh ..ローカルコピーを作成し、ファイルをHEADの状態にリセットし、必要なコミットを行ってから、コピーから作業を復元し始めます。実際にどのように処理する必要がありますか?私はこれが道だとは思いませんよね?私はそうは思いません。なぜなら、それは皆(少なくとも未来も知らない)には幾分頻繁に出会わなければならないからです。それとも、私のワークフローに欠陥があるようです。


1
通常、ライブラリと構成を追加するときに、同じような状況に陥ります。私はちょうど使用しgit status、すべての変更されたファイルを参照して、使用して、2つの以上のコミットを行いgit add、特定のファイル(の代わりにgit add --all)、そして少しずつをコミットします。
クリスサイレフィス

でファイルの一部を選択しgit add -p、それらの部分のみをコミットできます。これは非常に強力な手法であり、私はほとんど常にそれを使用しています。
eush77

回答:


17

これを解決する方法は複数あります。

現在の変更を妨げることなく、最初のコミットの変更を行いたい場合は、を使用できますgit stash。これにより、開いているすべての変更が破棄され、後で復元できます。git statusそれらがもう存在しないことを確認するために使用します。使い慣れた最初のコミットを作成します。次にgit stash pop、元の変更を復元し、2番目のコミットを作成して、主要な作業を行うことができます。

別の方法は、必要なすべての変更を行ってから、作業の一部を含む2つのコミットを作成することです。そのためには、gitが提供するインデックス(ステージング領域とも呼ばれます)を使用できます。これは、コミットの準備に使用できる特別な領域です。複数のファイルを変更した場合、を使用して各ファイルをインデックスに追加できますgit add。実行するgit commitと、インデックスに追加されたファイルのみがコミットされます。git status変更のどの部分がコミットされ、どの部分がコミットされないかが表示されます。たとえば、ファイルa.txt、b.txt、c.txtを変更した後、次のようにすると、次のようになりますgit add a.txt

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

あなたがやっている場合はgit commit、この状態では、A.TXTへの唯一の変更は、あなたのコミットに追加されます。

さらにgit diff --cached、を使用してコミットする正確な変更を確認できます。これにより、コミットされるすべての変更の差分が表示されます。

1つのファイルに両方のコミットの変更が含まれている場合、「git add --patch b.txt」を使用して、その一部のみをインデックスに追加することもできます。gitは、指定されたファイルをインデックスに追加する必要がある場合、各ファイルの変更を要求する対話モードを提供します。隣り合う行に変更があり、2つのコミットで分割する必要がある場合、これは難しくなる可能性がありますが、それを解決する方法もあります。

ステージング領域の詳細については、http//gitready.com/beginner/2009/01/18/the-staging-area.htmlをご覧ください。

インタラクティブな追加の詳細については、http//nuclearsquid.com/writings/git-add/をご覧ください。


5

AtlassianのSourceTreeやのようなGitのGUIを使用する場合git gui、ファイルの一部をコミットし、他の部分はコミットしないでおくことができます。実際、個々のコード行をコミットできます。

あなたが説明するようにウサギの穴に落ちたとき、私はこれを頻繁に行います。これは、賢明なコミットを、メインコミットの前段階としてコミットする素晴らしい方法です。

コマンドラインからこれを行うことができますが、それはちょっと不器用です。

Gitパッチレベルと個々の行でコミットできる場合、新しいブランチ、stash、commit、stash、mergeを作成する必要はありません。ただ働き続け、流れを壊さないでください。あなたは良いことをしている。


@MasterMastic THISはあなたの受け入れられた答えであるべきです。コードの個々の行だけをコミットできることは、驚くべき天の恵みです。
JesseTG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.