一、Commit
1.1 Add Commit
对于新增文件A、B和C,尽量采用分组提交的方式,而不是add --all
。例如,A和B是修改了某一个功能,C修改了另一个功能,则使用两次commit,每一次commit备注其修改的内容。
1.2 Patch
假设我们的一个文件其做了多个部分的修改,并且引入了我们自己的调试输出。直接使用add会添加全部的修改,使用add -p
则可以指定其提交的部分。例如:
@@ -1,16 +1,31 @@
#include <stdio.h>
+void fun1()
+{
+ printf("before hello world\n");
+}
+
void demo()
{
;
}
+void fun2()
+{
+ printf("after hello world\n");
+}
+
int main()
{
+ fun1();
printf("hello world\n");
+ printf("debug %s %d\n", __func__, __LINE__);
printf("hello world\n");
printf("hello world\n");
printf("hello world\n");
+ printf("debug %s %d\n", __func__, __LINE__);
printf("hello world\n");
+ fun2();
demo();
+ printf("debug %s %d\n", __func__, __LINE__);
}
如果我们只想提交fun1的内容,则使用-p
来指定需要提交的部分。输入git add -p test.c
,git会将代码拆分为多个片段,对于每一个片段有如下命令选择(git会提示你Stage this hunk [y,n,q,a,d,/,s,e,?]?
):
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
y - 暂存此区块
n - 不暂存此区块
q - 退出;不暂存包括此块在内的剩余的区块
a - 暂存此块与此文件后面所有的区块
d - 不暂存此块与此文件后面所有的 区块
g - 选择并跳转至一个区块
/ - 搜索与给定正则表达示匹配的区块
j - 暂不决定,转至下一个未决定的区块
J - 暂不决定,转至一个区块
k - 暂不决定,转至上一个未决定的区块
K - 暂不决定,转至上一个区块
s - 将当前的区块分割成多个较小的区块
e - 手动编辑当前的区块
? - 输出帮助
1.3 Message
对于提交,建议使用git commit
来详细描述文件,而不是使用git commit -m "message"
的方式。生成的提交文件是./git/COMMIT_EDITMSG
。对于描述文件,一般格式如下:
type(scope): subject
body
footer
<!-- git自动生成的内容 -->
其中type(scope): subject
又被称为header,type的类型如下:
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
scope
用于说明commit影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。subject
为简短的描述内容,同-m "message"
中的内容。body
为主要描述内容,footer
用于不兼容变动和关闭issue。下面是一个完整的参考:
feat: new funcion in hello
Add new function, which return 5.
- hello.h add: int func()
- hello.c change the cout
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# modified: hello.cpp
# new file: hello.h
#
二、Branch
推荐使用:
master ................................................... -> master
-> dev -> dev -> dev
-> feature -> feature -> feature
三、gitignore
假设我们现在有几个文件与目录:
build/
src/
CMakeLists.txt
现在我们不需要提交build/
文件中的内容,我们可以写一个.gitignore
文件,文件排列如下:
build/
src/
CMakeLists.txt
.gitignore
.gitignore
的内容如下:
.gitignore
build/
Comments | NOTHING