git
いくつかの背景知識を提供するために、「一部の友達のみ提出」ワークフローをからに移植しようとしますsvn
。
インタラクティブなセクションがあり、git
送信したいブロックを編集することもできます(送信したいブロック部分を選択するか、元のブロックになかったコンテンツを送信することもできます)。そんなことはありませんsvn
ができますdiff
/ patch
。
それでは、いくつかのテストをしましょう。最初のスクリプトは、単一のコミットでリポジトリを作成し、ファイルを編集し、対話型ステージングを実行します。
#!/usr/bin/env bash
set -eu
rm -rf 1 # !!! it removes dir `1`
mkdir 1
cd "$_"
git init
echo 'aaa
bbb' > 1
git add 1
git ci -am c1
sed -i 's/aaa/aaa\n111\n222\n333/' 1
git add -p
git --no-pager diff
git --no-pager diff --cached
スクリプトを実行し、ブロックで何をするかを尋ねられたら、編集を選択して「+222」行を削除してからエディタを終了します。あなたは見ることができます:
Initialized empty Git repository in /home/yuri/_/1/1/.git/
[master (root-commit) 1274f4f] c1
1 file changed, 2 insertions(+)
create mode 100644 1
diff --git a/1 b/1
index dbee026..5c89250 100644
--- a/1
+++ b/1
@@ -1,2 +1,5 @@
aaa
+111
+222
+333
bbb
Stage this hunk [y,n,q,a,d,/,e,?]? e
diff --git a/1 b/1
index f1dea50..5c89250 100644
--- a/1
+++ b/1
@@ -1,4 +1,5 @@
aaa
111
+222
333
bbb
diff --git a/1 b/1
index dbee026..f1dea50 100644
--- a/1
+++ b/1
@@ -1,2 +1,4 @@
aaa
+111
+333
bbb
2番目のスクリプトは、同様のパッチを生成して「+222」行を削除してから、結果のパッチを適用しようとします。
#!/usr/bin/env bash
set -eu
rm -rf 2 # !!! it removes dir `2`
mkdir 2
cd "$_"
echo 'aaa
bbb' > 1
echo 'aaa
111
222
333
bbb' > 2
diff -u 1 2 > 1.patch || true
cat 1.patch
sed -En -i '/\+222/!p' 1.patch
cat 1.patch
patch -p0 < 1.patch
しかし、失敗します。
--- 1 2015-12-04 21:52:58.815274483 +0200
+++ 2 2015-12-04 21:52:58.815274483 +0200
@@ -1,2 +1,5 @@
aaa
+111
+222
+333
bbb
--- 1 2015-12-04 21:52:58.815274483 +0200
+++ 2 2015-12-04 21:52:58.815274483 +0200
@@ -1,2 +1,5 @@
aaa
+111
+333
bbb
patching file 1
patch: **** malformed patch at line 7:
部品を手動で編集せずに機能させる方法はありますか@@ -1,2 +1,5 @@
?