likes
comments
collection
share

Git 的正确打开方式?拿来吧你!!!🐱‍💻 最全教程持续更新

作者站长头像
站长
· 阅读数 5

Git的正确打开方式

首先我们要知道Git是什么

他是一个基于差异的版本控制器,主要是储存基本文件随时间逐步积累的差异 他大部分操作都是本地执行,一般只添加数据,而不是删除修改 有已提交,已暂存,已修改,三个状态,修改后保存到已暂存区等待一次性提交

Git初次运行前的配置

  1. 设置用户名和邮件地址,每一个Git提交都会使用,会被记录到每一次提交中且不可更改

  2. 如果不想使用默认文本编辑器,可以这样^1^,比如更改成Emacs,在windows系统上使用别的编辑器必须提供可执行文件^2^

     1. $ git config --global core.editor emacs
     2. $ git config --global core.editor "url"
    

Git 命令的综合手册(manpage)

当你需要获取帮助时使用,使用时无需联网,超方便

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

同时使用-h可以获得更简洁的帮助,以上命令展现的时全面的帮助

2.1 Git 仓库

创建新的 Git 仓库

$ cd /c/user/my_project

//继续
$ git init

//将创建一个.git的子目录,里面包含着所有的初始化的git必须文件

克隆现有的仓库

使用git clone url命令,克隆git仓库近乎所有的数据

$ git clone https://github.com/libgit2/libgit2

//在当前目录下创建一个libgit2的目录,并在其下初始化一个.git的文件夹

2.2 记录更新到仓库

已跟踪文件:被纳入了版本控制的文件,Git已知晓的文件

检查当前文件状态

使用git status命令

//得到这个说明工作目录自上次提交后未曾更改
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

//试图在我创建的"My Project"项目下添加一个文件夹"README"
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/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)

跟踪新文件

使用git add开始跟踪一个文件

$ git add README

再次查看当前文件状态

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)

new file:   README

Changes to be committed:以下的说明是已暂存状态

暂存已修改文件

Changes not staged for committed:已跟踪文件内容发生了变化但未放到暂存区,即更新,暂存这次更新时需要运行gir add命令,这是一个多功能命令

git add : 可以用于跟踪新文件,用于将已跟踪文件放到暂存区,用于合并时吧冲突文件标记为已解决状态

此时文件已暂存,如果我们在该文件未提交时再次进行修改会发生什么呢? 答案就是他同时出现在了暂存区和非暂存区 但是提交时仍旧提交的上一个运行过git add的版本 所以无论如何,在做了修改以后要记得暂存

状态简览

git status命令输出十分详细,但是我们也有一种更为简洁的查看方式

git status -s
//或者
git status -short

//输出
$ git status -s
M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

其中

?? 新添加的未跟踪文件

A 新添加到暂存区

M 修改过的文件

忽略文件

我们可以创建一个.gitignore结尾的文件,来列出要忽略的文件的模式 一般情况下,一个仓库只有根目录下有一个.gitignore文件,他被递归地应用到整个仓库中,而子目录下也可以有额外的该文件,子目录下的文件只应用到他的目录中

GitHub有一个十分详细的.gitignore文件列表: github.com/github/giti…

格式规范如下:

所有空行或者以 # 开头的行都会被 Git 忽略。

可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。

匹配模式可以以(/)开头防止递归。

匹配模式可以以(/)结尾指定目录。

要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

# 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

查看已暂存和未暂存的修改

如果你想知道具体修改了说明地方,可以使用git diff命令,他可以让我们知道,当前哪些更新未暂存,哪些更新已暂存正在等待提交.

git diff相较于git status是以文件补丁的格式来展示更新,能让我们更加具体的了解具体在哪里发生了变化

我们先输入git status查看状态

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

    modified:   README

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

我们可以知道README文件已修改暂存,而CONTRIBUING.md文件已修改未暂存 此时我们要查看尚未暂存的文件更新了哪部分,使用git diff

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's

git diff比较的是工作目录中当前文件和暂存区快照之间的差异,即未暂存的变化内容

要查看下次提交的内容,可以使用git diff --staged或者git diff --cached(同义词) 他会对比已暂存的文件和最后一次提交的文件的差异

$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

但是git diff本身只显示未暂存的改动

和status一样,如果已暂存文件未提交又修改且未再次保存,在git diff命令下和git diff --staged命令下都会出现该文件的名字,同样提交也只会提交先前已暂存的部分.

提交更新

git commit是提交命令,输入后会启动你所选择的文本编辑器来输入提交说明

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
#	new file:   README
#	modified:   CONTRIBUTING.md
# (在这里输入你的提交说明)
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

推出编辑器时,Git会丢弃注释行,用提交说明生成一次提交

也可以用commit -m命令,将提交信息与命令放在同一行

$ git commit -m "(提交信息)Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README

//提交信息中会告诉你,当前是哪个分支(master)提交的

跳过使用暂存区

使用git commit -a命令,将所有已跟踪过的文件暂存起来一并提交,跳过git add暂存步骤

但是这也会加入一些不需要的文件

移除文件

如果只是从工作目录简单删除文件,运行git status时会在未暂存区看到他

我们可以通过将已跟踪文件从暂存区移除,然后提交,使用git rm命令完成

将之前修改过或已经放到暂存区的文件删除,可以使用强制删除,不可被修复,使用git rm -f

如果忘记使用.gitignore,不小心将一堆注释添加到暂存区可以使用git rm --cached命令,后可接文件或目录的名字,也可以使用glob模式

//删除所有名字以~结尾的文件
$ git rm \*~

//删除log/目录下扩展名为.log的所有文件
$ git rm log/\*.log

移动文件

如果在Git中发生了重名,他不会具体地显示是一次改名操作

如果要在Git中改名可以这样使用git mv

$ git mv file1_from file2_to

他相当于将文件1移入文件2,然后删除原文件1,暂存文件2

$ mv README.md README
$ git rm README.md
$ git add README

2.3 查看提交历史

查看提交历史

使用git log命令,会按时间顺序列出所有提交

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

使用git log -pgit log -patch可以看到每次提交所引入的差异(即补丁),我们可以使用一些选项来限制显示日志数量,如-2只显示最近的两次提交

使用git log --stat可以看到每次提交的简略统计信息,比如所有被修改过的文件,有多少文件被修改以及哪些被修改文件是被移除或添加了

使用git log --pretty可以用其他风格展示提交历史,其内部还包含其他子选项, 比如 oneline 会将每个提交放在一行显示

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

使用git log --format定制记录的显示格式,输出的格式不会随着Git的更新而发生改变

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
  1. %H--提交的完整哈希值

  2. %h--提交的简写哈希值

  3. %T--树的完整哈希值

  4. %t--树的简写哈希值

  5. %P--父提交的完整哈希值

  6. %p--父提交的简写哈希值

  7. %an--作者名字

  8. %ae--作者的电子邮件地址

  9. %ad--作者修订日期(可以用 --date=选项 来定制格式)

  10. %ar--作者修订日期,按多久以前的方式显示

  11. %cn--提交者的名字

  12. %ce--提交者的电子邮件地址

  13. %cd--提交日期

  14. %cr--提交日期(距今多长时间)

  15. %s--提交说明

git log的常用选项

-p

按补丁格式显示每个提交引入的差异。

--stat

显示每次提交的文件修改统计信息。

--shortstat

只显示 --stat 中最后的行数修改添加移除统计。

--name-only

仅在提交信息后显示已修改的文件清单。

--name-status

显示新增、修改、删除的文件清单。

--abbrev-commit

仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。

--relative-date

使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。

--graph

在日志旁以 ASCII 图形显示分支与合并历史。

--pretty

使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。

--oneline

--pretty=oneline --abbrev-commit 合用的简写。

限制输出长度

就像上述过的-2选项,限制显示最新的两条更新

还有按时间作限制的选项,比如 --since--until

//列出最近两周的所有的提交
$ git log --since=2.weeks

//列出具体某一天的提交
$ git log --since=2008-01-15

//列出一个相对日期的提交
$ git log --since="2 years 1 day 3 minutes ago"

还有按指定条件作限制的提交

--author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。其中可指定多个 --author--grep 为搜索条件,也可以添加 --all-match 输出所有匹配 --grep 模式的提交

-S 接收一串字符串参数,只会显示那些添加或删除了该字符串的提交

//寻找删除或添加了对某一个函数的引用的提交
$ git log -S function_name

如果只关心某些文件或者目录的历史提交,可以在log选项后指定他们的路径,要记得用 -- 将前面选项和路径分开

限制 git log 输出的选项(总结)

-

仅显示最近的 n 条提交。

--since, --after

仅显示指定时间之后的提交。

--until, --before

仅显示指定时间之前的提交。

--author

仅显示作者匹配指定字符串的提交。

--committer

仅显示提交者匹配指定字符串的提交。

--grep

仅显示提交说明中包含指定字符串的提交。

-S

仅显示添加或删除内容匹配指定字符串的提交。

隐藏合并提交

--no-merges可以将包含信息不多的提交合并起来,以免弄乱历史记录

2.4 撤销操作

撤销操作