[TOC]
序文
この記事はあなた自身の意見の一部のみを記録していますが、正確ではない可能性があります。学習中の一部の記録のために、スプレーしないでください、ありがとう
この記事では主にgit stashコマンドの使用法を紹介しますが、コマンドはどのようなシナリオに適用されますか?下記の通り
私たちのエンタープライズ開発には、オンライン環境のマスターや研究開発用のdevブランチなど、複数のブランチがあります。要件があり、devブランチでコードを書いているとしましょう。オンライン環境には重大なバグがあり、すぐに解決する必要があります。現時点では、masterブランチに戻って変更することはできません。変更しないと、書き込まれたコードの半分が失われます。この時点で、git stashコマンドを使用して支援できます。
git stashコマンドは、現在のワークスペースのすべての変更を保存し、現在のブランチの最新のコードに復元し、必要に応じてこのコマンドを使用して以前に保存したすべての変更を復元できます。
ブログの助けを借りて、より明確な説明は次のとおりです:https : //blog.csdn.net/stone_yw/article/details/80795669
一般に、git stashコマンドの目的は、まだ送信されていないがスタックに変更されたコンテンツを保存することであり、スタック内のコンテンツは後でブランチに復元できます
次に、変更したコードを保存する方法を示します。
1. git stash
[root@huangzb mygit]# git branch
* master
new_branch
[root@huangzb mygit]#
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout new_branch
Switched to branch 'new_branch'
[root@huangzb mygit]# ll
total 8
-rw-r--r-- 1 root root 24 Mar 27 18:15 a.txt
-rw-r--r-- 1 root root 12 Mar 27 18:15 b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello b' > a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
[root@huangzb mygit]#
上の図では、既存のファイルが新しいブランチで変更され、ブランチを切り替えると例外が発生します。つまり、変更されたファイルが保存または送信されます。保存方法を見てみましょう
一部の人々は、2つが異なるブランチにあると尋ねるかもしれません。コードを直接送信した後でブランチを切り替えてみませんか?
実際、ブランチを切り替える前にコードを送信できますが、ここではコードが記述されておらず送信できないと想定して、前提をシミュレートします。
次に示すように、git stashコマンドを使用して操作を保存しましょう。
[root@huangzb mygit]# git stash
Saved working directory and index state WIP on new_branch: 0dae8a5 create b.txt
HEAD is now at 0dae8a5 create b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]# git checkout master
Switched to branch 'master'
[root@huangzb mygit]#
上の図からわかるように、git stashコマンドを使用した後、ファイルの変更が最初に保存されます。実際、単純にgit stashを使用して操作を保存し、デフォルトのルールを使用してコメントを生成します。もちろん、コメントメッセージを自分で指定することもできます。
2. git stash save [メッセージ]
保存するメモを指定するには、git stash saveコマンドを使用します
操作は次のとおりです。
[root@huangzb mygit]# echo 'hello c' > a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git stash save '将a.txt 内容覆盖为 hello c'
Saved working directory and index state On new_branch: 将a.txt 内容覆盖为 hello c
HEAD is now at 0dae8a5 create b.txt
[root@huangzb mygit]#
したがって、保存した後、レコードを表示するには、次のコマンドgit stash listを使用できます。
3. git stashリスト
コマンドgit stash listを使用して表示します
git stashコマンドを使用して指定した操作を保存すると、レコードが作成され、現在のブランチのレコードのリストを表示する場合は、コマンドgit stash listを使用して表示できます。操作は次のとおりです。
[root@huangzb mygit]# git stash list
stash@{0}: On new_branch: 将a.txt 内容覆盖为 hello c
stash@{1}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
上の図からわかるように、2つのレコードが保存されており、異なるメッセージのメモが表示されています。このレコードを保存する方法は、先入れ先出し方式であるgitのスタックデータ構造を使用していることがわかります。一番上のレコードは最新のコミットです。
送信されたリストは表示されますが、保存されたコンテンツはどのように表示されますか?
git stash showコマンドを使用して、
4. git stashショー
git stash showコマンドを使用して、最近保存したファイルの違いを表示できます
操作は次のとおりです。
[root@huangzb mygit]# git stash show
a.txt | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
上の図から、変更されたファイル、削除された行の数、追加された行の数、および何も表示されないことだけを確認できます。現時点では、パラメータ-pを追加して、より明確に確認することができます。
[root@huangzb mygit]# git stash show -p
diff --git a/a.txt b/a.txt
index 40f4dc0..947f8df 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1 @@
-hello 1
-hello 2
-hello 3
+hello c
-pパラメータを追加すると、非常にはっきりと見ることができます。
操作を保存する前に、ブランチを切り替えて他のことを実行する必要がありました。これで完了したので、元のデータを復元して作業を続行する必要があります。つまり、保存されたデータを復元する方法
コマンドgit stash popを使用できます
5. git stash pop
保存された最新のレコードの1つを復元して、Javaのスタックのスタック操作と同様に、最新のデータを取得し、レコードを削除します
効果を見てみましょう。操作は次のとおりです。
[root@huangzb mygit]# git stash list
stash@{0}: On new_branch: 将a.txt 内容覆盖为 hello c
stash@{1}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
[root@huangzb mygit]#
[root@huangzb mygit]# git stash pop
# On branch new_branch
# 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: a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1c809fc6d4936282af1e4177c3e99dc456b3da75)
[root@huangzb mygit]# cat a.txt
hello c
[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
上記の図から、リストには元々2つのレコードがあったことがわかります。popコマンドを使用した後、ファイルa.txtの内容が保存前の状態に復元されたことがわかりました。コマンドgit stash listを再度使用した後、レコードが1つしかなく、削除されたことがわかります以前のトップレコードなので、git stash popコマンドの特性をまとめます
- 最近のデータを復元
- レコードを削除
次に、popコマンドで最新の操作を復元します。リストリストの特定の時点でレコードを復元する場合は、git stash applyコマンドを使用できます。
6. git stash apply [stash name]
指定した名前のレコードを復元するには、applyコマンドを使用します。名前を記述しない場合、リストの最新のアイテムがデフォルトで復元されます。ただし、このコマンドはデータを復元するだけで、レコードは不明確です。
操作は次のとおりです。
[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
[root@huangzb mygit]#
[root@huangzb mygit]# git stash apply stash@{0}
error: Your local changes to the following files would be overwritten by merge:
a.txt
Please, commit your changes or stash them before you can merge.
Aborting
[root@huangzb mygit]#
上の図から、コマンドを使用して最新の操作を復元したため、コマンドを使用した後に異常が見つかったことがわかります。現時点では、ワークスペースがクリーンではないため、保存した別のレコードを復元することはできません。現在の操作は保存または破棄されます。ここでは、まず保存してから、履歴を復元します。操作は次のとおりです。
[root@huangzb mygit]# git commit -am 'stash first'
[new_branch a8d8b2a] stash first
1 file changed, 1 insertion(+), 3 deletions(-)
[root@huangzb mygit]#
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]#
[root@huangzb mygit]# git stash apply stash@{0}
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
[root@huangzb mygit]# cat a.txt
<<<<<<< Updated upstream
hello c
=======
hello b
>>>>>>> Stashed changes
[root@huangzb mygit]#
レコードを保存した後、元の操作を復元します。復元後、ファイルが競合していることがわかりました。競合は以下で解決できます。
[root@huangzb mygit]# echo 'hello aa' > a.txt
[root@huangzb mygit]# git commit -am '解决冲突'
[new_branch c26203d] 解决冲突
1 file changed, 1 insertion(+), 1 deletion(-)
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]#
ここで私は紛争を単純かつ激しく解決します。ポイントは、リストにレコードがあるかどうかを見てみましょう
[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
applyコマンドを使用して操作を復元した後でもレコードが残っていることがわかったので、apply操作とpop操作の違いを要約できます。
- popコマンドは最新のレコードのみを復元でき、復元するレコード名は指定できません。applyは復元するレコード名を指定できます
- popコマンドの復元操作の後、レコードは同時に削除され、適用はデータの復元のみを行い、レコードは削除されません
この時点で、リストのレコードは不要になりましたが、削除したい場合はどうすればよいでしょうか。
コマンドgit stash drop [stash name]を使用してレコードを削除できます
7. git stash drop [stash name]
dropコマンドを使用して、指定したメッセージ名のレコードを削除します
操作は次のとおりです。
[root@huangzb mygit]# git stash drop stash@{0}
Dropped stash@{0} (f56c4829229393701a666f0d198f467f592e54a1)
[root@huangzb mygit]#
[root@huangzb mygit]# git stash list
[root@huangzb mygit]#
もちろん、レコードが多い場合は、1つずつ削除するのが面倒なので、一度にすべてのレコードを削除できます
8. git stash clear
レコードが多い場合、1つずつ削除するのは面倒です。すべてのレコードを一度に削除できます。
現在のリストにはデータがないため、デモは行われず、比較的簡単です