git入门(一)

1.Git基础入门

本文参考:https://git-scm.com/

1.0 git的三种状态

未修改,已修改, 已暂存,

工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

image

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,887评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,921评论 0 11
  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 2,918评论 1 4
  • 模糊管理也是一门学问 一次,我从上海出差回来,一到厂里,行政科的扬政就向我汇报:“前天锯木车间有人偷了两卷油...
    室静兰香a阅读 329评论 0 7
  • 我要的,是那种我与世界和解,与人和解,能量流动后产生的坚定信任!世界上有很多忠诚的人,有很多欺骗的人。忠诚来源于...
    weeklybright阅读 331评论 0 0