Stash は、コミットされていない変更を隠しておくだけなので、しばらく他の作業を行うことができます。昔は、変更をコミットし、ブランチを切り替え、元に戻し、「git reset HEAD^」を使用してコミットを元に戻していました。
リベースに関しては、ここに私のメモがあります:
マージに似ていますが、継続性の単一のスレッドを保持します。
簡単に言えば、rebase は現在のブランチを取得し、その履歴を検索して、指定されたブランチから分岐したポイントを探します。次に、これらすべてのコミットをパッチとして取得し、指定されたブランチに適用して、それらのコミットを指定されたブランチの最後に効果的に移植します。
前:
E--F--G mybranch
/
A--B--C--D upstream
「上流のリベース」の後:
E'-F'-G' mybranch
/
A--B--C--D upstream
両方のブランチにコミットがある場合 (たとえば、誰かにパッチをメールして適用した場合など)、重複して適用されることはありません。マニュアルページを参照してください。
注:これは、ブランチのコピーを既に持っている人を台無しにする可能性があります。このコマンドは、まだ別のリポジトリにプッシュされていないコミットでのみ使用するのが最適です。
アップストリームは、ブランチまたはその他の有効なコミットである可能性があります。
競合が発生した場合、git は影響を受けるファイルに競合マーカー (<<<<<) を追加し、リベースを停止します。競合を解決したら、「git add file」を使用します。すべての競合が処理されたら、「git rebase --continue」を使用します。「git rebase --abort」でリベースをキャンセルすることもできます
現在のブランチにコミットされていない変更がある場合は、リベースを行う前にまずそれらを隠しておく必要があります。
また、「-i」オプションを使用して現在のブランチの履歴を書き直すこともできます (「コミットの再配置」を参照)。
前:
A--B--C--D--E
後:
A--B--E'-C'-D'
または、コミットを結合 (スカッシュ) することもできます:
A--B--CE'-D'
または、チェーンからコミットを完全に削除します。
A--B--D'-E'
に:
この--onto branch
オプションを使用すると、変更を別のブランチに完全に移植できます。たとえば、ブランチがブランチ 'foo' からフォークされたとします。
o--o--o--o--o master
\
o--o--o--o--o foo
\
o--o--o mybranch
しかし、今は master から fork したい:
o--o--o--o--o master
\ \
\ o--o--o mybranch
\
o--o--o--o--o foo
mybranch をチェックアウトして、次のコマンドを実行します。
git rebase --onto master foo
英語では、これは「foo 以降のすべての変更 (ただし、foo を含まない) を取得し、それらを master に適用する」という意味です。
--onto を使用して、チェーンからコミットを切り離すこともできます。マニュアルページを参照してください。-i もこれに使用できます。
注: rebase は有害と見なされます: このコマンドは、履歴を効果的に書き換えることによって機能します。過去のある時点からリポジトリの状態を再構築することが不可能な状態になる可能性があります。たとえば、上記の最初の例では、リポジトリの状態 E、F、および G が永久に失われます。
幸いなことに、リベースを実行する前にブランチ名またはタグを何かに割り当てておけば、何も失われることはありません。リベースを行う前に行っていればgit branch foo
、ブランチ「foo」はリポジトリの元の状態 G を指し、後で復元可能になります (ブランチ foo を削除するまで)。
E-F-G foo
/
/ E'-F'-G' mybranch
/ /
A--B--C--D upstream