1.Git基础入门
本文参考:https://git-scm.com/
1.0 git的三种状态
未修改,已修改, 已暂存,
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
1.1 git查看文件当前状态
要查看哪些文件处于什么状态,可以用 git status 命令。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master
nothing to commit, working directory clean
代表所有文件都处于未修改状态.若有文件修改如创建一个
新的README文件,再运行git status
,你将会看到一个新的未跟踪文件:
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
未跟踪文件不会随着commit的提交而提交
使用git status -v
可以使得输出的提示更为简洁明了
1.2 git 添加文件跟踪
使用命令git add
开始跟踪一个文件。 所以,要跟踪 README 文件,运行:
$ git add README
此时再运行git status
命令:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
此时代表可以提交,文件的增加和编辑都会使得文件变为修改态而不会自动被跟踪 需要执行一次
git add filename
命令;
1.3 git 忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。 来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~
此文件表示,所有以
.o
或.a
结尾的文件都将被忽略;
文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
以下为举的栗子:
# no .a files
#忽略以.a结尾的文件
*.a
# but do track lib.a, even though you're ignoring .a
# 即使忽略了lib.a,也要跟踪它
files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
# 只在当前目录中忽略TODO文件,而不忽略子目录中的TODO文件
/TODO
# ignore all files in the build/ directory
# 忽略`build`目录中的所有文件
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
# 忽略doc目录中的所有.txt文件,但不忽略其子目录中的*.txt文件
doc/*.txt
# ignore all .pdf files in the doc/ directory
# 忽略doc目录中的所有文件,包括其所有子,孙...目录
doc/**/*.pdf
1.4 提交更新
每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit:
$ git commit
此命令输入后会进入一个编辑页面,可以编辑我们对此次更新的说明 . 编辑工具一般由系统默认的编辑工具,当然也可以使用
git config --global
命令指定编辑工具.编辑页面如下
# 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:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
可以看到,默认的提交消息包含最后一次运行 git status 的输出,放在注释行里.
当我们的更新备注说明比较简短时,可以采用以下命令将提交信息与命令放在同一行:
$ git commit -m "我的备注信息"
1.5 跳过使用暂存区域
每次提交都需要git add filename
显得略微麻烦.于是,我们可以采用-a
选项,Git就会把所有已跟踪过的文件暂存起来一起提交.
$ git status
On branch master
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: CONTRIBUTING.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)
此例中的
CONTRIBUTING.md
文件就没有使用git add
一样提交成功
1.6 删除,移动文件
删除文件git rm filename
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
下一次提交时,该文件就不再纳入版本管理了。 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(这样的数据不能被Git修复)
删除文件支持
glob
模式.
##删除 log/ 目录下扩展名为 .log 的所有文件
$ git rm log/\*.log
##删除以 ~ 结尾的所有文件
$ git rm \*~
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加
.gitignore
文件,不小心把一个很大的日志文件或一堆.a
这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用--cached
选项:
$ git rm --cached README
移动文件 git mv file1 file2
$ git mv README.md README
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
提示为 重命名 ,其实它执行了以下三个步骤
$ mv README.md README
$ git rm README.md
$ git add README
1.7 查看提交历史
最简单有效的命令为:
$ git log
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:30:12 2018 +0800
Add file sync module
commit e410642799a3cea3834122abd96f8dd9977dd407
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:21:15 2018 +0800
Add file sync module
commit 571ff73a4ef898fa090577b22f5e66bbf796b925
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:08:41 2018 +0800
Add file sync module
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log
常用选项
一个常用选项: -p
显示每次提交内容的差异.-2
显示最近2此提交
$ git log -p -2
commit fc6135241fc19f3f2550b3795d1896a5d29fdd0d (HEAD -> master, origin/master)
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:30:12 2018 +0800
Add file sync module
diff --git a/roles/test-file-sync/task/main.yml b/roles/test-file-sync/tasks/main.yml
similarity index 100%
rename from roles/test-file-sync/task/main.yml
rename to roles/test-file-sync/tasks/main.yml
diff --git a/roles/test-file-sync/task/test-file-sync.yml b/roles/test-file-sync/tasks/test-file-sync.yml
similarity index 100%
rename from roles/test-file-sync/task/test-file-sync.yml
rename to roles/test-file-sync/tasks/test-file-sync.yml
commit e410642799a3cea3834122abd96f8dd9977dd407
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:21:15 2018 +0800
Add file sync module
diff --git a/test-file-sync.yml b/test-file-sync.yml
index dd046d8..e56a460 100644
--- a/test-file-sync.yml
+++ b/test-file-sync.yml
@@ -4,4 +4,4 @@
hosts: "{{hosts}}"
remote_user: deploy
roles:
- - role: test-file-sync
+ - test-file-sync
--stat
查看每次提交的简略统计信息.
在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。
$ git log --stat -2
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:30:12 2018 +0800
Add file sync module
roles/test-file-sync/{task => tasks}/main.yml | 0
roles/test-file-sync/{task => tasks}/test-file-sync.yml | 0
2 files changed, 0 insertions(+), 0 deletions(-)
commit e410642799a3cea3834122abd96f8dd9977dd407
Author: Sunshuaju <825658839@qq.com>
Date: Tue Mar 27 19:21:15 2018 +0800
Add file sync module
test-file-sync.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--pretty
:可以自己指定格式去显示提交历史
内置的格式有:oneline,short,full,fuller
$ git log --pretty=oneline -2
fc6135241fc19f3f2550b3795d1896a5d29fdd0d (HEAD -> master, origin/master) Add file sync module
e410642799a3cea3834122abd96f8dd9977dd407 Add file sync module
可以使用format定制记录格式
一定要注意它们之间的空格.
$ git log --pretty=format:"%h - %an, %ar : %s"
$ git log --pretty=format:"%h - %an, %ar : %s" -2
fc61352 - Sunshuaju, 23 hours ago : Add file sync module
e410642 - Sunshuaju, 23 hours ago : Add file sync module
***--pretty=format:
常用选项****
作者和提交者之间的区别:
当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
--graph
使用一些ASCII字符形象的展示分支
git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
限制输出长度
显示最近两周
$ git log --pretty=fromat:"%h - %an " --since=2,weeks --graph
* fromat:fc61352 - Sunshuaju
* fromat:e410642 - Sunshuaju
* fromat:571ff73 - Sunshuaju
* fromat:1245315 - Sunshuaju
* fromat:12031d1 - Sunshuaju
* fromat:f94735e - Sunshuaju
* fromat:6a49d03 - Sunshuaju
* fromat:5271e4c - Sunshuaju
* fromat:4442dc4 - Sunshuaju
* fromat:79b9c22 - Sunshuaju
* fromat:8251766 - Sunshuaju
* fromat:8ba2da9 - Sunshuaju
|\
| * fromat:92d2ecb - Sunshuaiju
| |\
| * | fromat:c560522 - Sunshuaiju
* | | fromat:c3a85e4 - Sunshuaju
| |/
|/|
* | fromat:08f4f48 - Sunshuaju
* | fromat:756f460 - Sunshuaju
|/
* fromat:8a41ed4 - Sunshuaju
git log
输出的选项常用选项
来看一个实际的例子,如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试文件,可以用下面的查询命令:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
在近 40000 条提交中,上面的输出仅列出了符合条件的 6 条记录
尊重原创,转载请注明出处:https://www.jianshu.com/p/53bcefb26599