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
두 번째 스크립트는 유사한 패치를 생성하고 "+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 @@
?