Git 项目有三个工做区域的概念:工做目录,暂存区域以及Git 仓库git
Git之中的文件有三种状态,文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 这三种状态其实并不重要,重要的是三个工做区域的概念,已提交表示git commit -m'xxx',文件保存到仓库了,已暂存表示文件已经执行了git add file,已暂存表示对一个已修改文件的当前版本作了标记,使之包含在下次提交的快照中,已修改表示对于本地工做目录之中的文件,进行了修改,是咱们普通创做的基本操做github
成功安装git后,会有一个 git config 的文件控制 Git 外观和行为的配置变量数据库
用户信息vim
当安装完 Git 应该作的第一件事就是设置你的用户名称与邮件地址。 每一次 Git 提交都会使用这些信息,而且它会写入到每一次提交中,不可更改,须要说明的是,以下的配置都是在bash命令行之中执行的,而不是在git config文件之中缓存
$ git config --global user.name "hello" $ git config --global user.email 123456789@qq.com
若是使用了 --global 选项,那么该命令只须要运行一次,这样是一种全局配置,若是要针对特定项目使用不一样的用户名称与邮件地址时,能够在那个项目目录下运行没有 --global 选项的命令来配置安全
Git 会使用操做系统默认的文本编辑器,一般是 Vim。 若是你想使用不一样的文本编辑器,例如 Emacs,可使用以下配置:bash
$ git config --global core.editor emacs
若是想要检查你的配置,可使用 git config --list 命令来列出全部 Git 当时能找到的配置。服务器
$ git config --list user.name=hello user.email=123456789@qq.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto ...
能够经过输入 git config <key>: 来检查 Git 的某一项配置less
$ git config user.name hello
获取帮助编辑器
若使用 Git 时须要获取帮助,有三种方法能够找到 Git 命令的使用手册:
$ git help <verb> $ git <verb> --help $ man git-<verb>
例如,要想得到 config 命令的手册,执行
$ git help config
有两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入全部文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。
在现有目录中初始化仓库
使用 Git 来对现有的项目进行管理,须要进入该项目目录并输入:
$ git init
该命令将建立一个名为 .git 的子目录,这个子目录含有初始化的 Git 仓库中全部的必须文件,这些文件是 Git 仓库的骨干。此时仅仅是作了一个初始化的操做,项目里的文件尚未被跟踪。在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,应该开始跟踪这些文件并提交。 可经过 git add 命令来实现对指定文件的跟踪,而后执行 git commit 提交
$ git add *.c $ git add LICENSE $ git commit -m 'initial project version'
若是想得到一份已经存在了的 Git 仓库的拷贝,好比说github上面的某一个项目,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎全部数据,而不是仅仅复制完成你的工做所须要文件。 当执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每个文件的每个版本都将被拉取下来。 克隆仓库的命令格式是 git clone [url] 。 好比,要克隆 Git 的可连接库 libgit2,能够用下面的命令
$ git clone https://github.com/libgit2/libgit2
这会在当前目录下建立一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下全部数据放入 .git 文件夹,而后从中读取最新版本的文件的拷贝。 以上命令获得的本地仓库和远程仓库名称相同,若是想在克隆远程仓库的时候,自定义本地仓库的名字,可使用以下命令
$ git clone https://github.com/libgit2/libgit2 mylibgit
这将执行与上一个命令相同的操做,不过在本地建立的仓库名字变为 mylibgit。
工做目录下的每个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被归入了版本控制的文件,在上一次快照中有它们的记录,在工做一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工做目录中除已跟踪文件之外的全部其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工做目录中的全部文件都属于已跟踪文件,并处于未修改状态。编辑过某些文件以后,因为自上次提交后对它们作了修改,Git 将它们标记为已修改文件。 咱们逐步将这些修改过的文件放入暂存区,而后提交全部暂存了的修改,如此反复。因此使用 Git 时文件的生命周期以下:
要查看哪些文件处于什么状态,能够用 git status 命令。 若是在克隆仓库后当即使用此命令,会看到相似这样的输出
$ git status On branch master nothing to commit, working directory clean
这说明全部已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还代表,当前目录下没有出现任何处于未跟踪状态的新文件,该命令还显示了当前所在分支,分支名是 “master”,这是默认的分支名。
如今在项目下建立一个新的 README 文件。 若是以前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件
$ echo 'My Project' > README $ 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)
在状态报告中能够看到新建的 README 文件出如今 Untracked files 下面。 未跟踪的文件意味着 Git 在以前的快照(提交)中没有这些文件;Git 不会自动将之归入跟踪范围,除非使用git add README来讲明我须要跟踪该文件, 次吃才会将此文件归入到跟踪范围之中,而且,此时此文件在暂存区,是一个快照,并未保存到Git 本地仓库之中永久存储
一般,咱们使用git status获得的文件状态比较复杂,咱们可使用git status -s来获取简略的信息,一般有A和M两种,A表示新添加的文件,M表示修改过的文件
使用命令 git add 开始跟踪一个文件。 因此,要跟踪 README 文件,能够运行以下命令行
$ git add README
此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README
只要在 Changes to be committed 这行下面的,就说明是已暂存状态。 若是此时提交,那么该文件此时此刻的版本将被留存在历史记录中。git add后文件存放在暂存区, git add是个多功能命令:能够用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。这个命令能够理解为“添加内容到下一次提交中”。
如今咱们来修改一个已被跟踪的文件。 若是修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,而后运行 git status 命令,就可实现对已经暂存的文件的状态查看
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: 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
文件 CONTRIBUTING.md 出如今 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但尚未放到暂存区。 要暂存此次更新,须要运行 git add 命令
而后运行 git add 将"CONTRIBUTING.md"放到暂存区,如今两个文件都已暂存,下次提交时就会一并记录到仓库。输入 git status 可看到
$ git add CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
假设此时,须要在 CONTRIBUTING.md 里加条注释, 而后保存,再运行 git status ,则有以下输出
$ vim CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md 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
此时的 CONTRIBUTING.md 文件同时出如今暂存区和非暂存区。 此时的操做是1.刚git add过一次,2.而后当即又修改了文档,3.再又运行git status命令。实际上此时的 Git 只不过暂存了运行 git add 命令时的版本(1处的版本), 若是此时提交,CONTRIBUTING.md 的版本是你最后一次运行 git add 命令时的那个版本(1处的版本),而不是在工做目录中的当前版本(2处的版本)。 因此,运行了 git add 以后又做了修订的文件,须要从新运行 git add 把最新版本从新暂存起来
$ git add CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
虽然,如今咱们可使用git status来查看文档的状态,可是这只是针对与文档的,也就是说,咱们能够看见那些文档是新增的,那些是修改的,可是具体文档之中修改了什么,新增了什么,咱们没法知道,这种状况下,咱们须要使用git diff命令来完成查看,尽管 git status 已经经过在相应栏下列出文件名的方式回答了这个问题,git diff 将经过文件补丁的格式显示具体哪些行发生了改变
git diff: 文件内容的增长和修改
假如再次修改 README 文件后暂存,而后编辑 CONTRIBUTING.md 文件后先不暂存, 运行 status 命令将会看到:
$ git status On branch 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
要查看还没有暂存的文件更新了哪些部分,不加参数直接输入 `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 --cached 命令。也就是比较同一个文件,在本次git add和前一次git add,两次git add之间的差异,cached表示两个快照之间的差异,Git 1.6.1 及更高版本还容许使用 git diff --staged,效果是相同的,但更好记些)
$ 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 自己只显示还没有暂存的改动,而不是自上次提交以来所作的全部改动。 因此有时候一会儿暂存了全部更新过的文件后,运行 git diff 后却什么也没有,就是这个缘由
引入新的例子,新建一个仓库,加入aaa.txt文档在其中,将其引入跟踪,运行一次git add aaa.txt,其中的内容为aaa ,而后修改aaa.txt,在第6行加入bbb,此时运行 git status ,可是此时并未『再次运行』git add命令,此时运行 git status 会看到暂存先后的两个版本。此处要查看的是未暂存的修改,效果以下
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: aaa.txt 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: aaa.txt
如今运行 git diff 看暂存先后的变化,此时查看的是未暂存的修改
$ git diff diff --git a/aaa.txt b/aaa.txt index 7c4a013..6dad95f 100644 --- a/aaa.txt +++ b/aaa.txt @@ -1 +1,6 @@ -aaa \ No newline at end of file +aaa + + + + +bbb \ No newline at end of file
而后用 当运行了git add命令后,再次运行git diff --cached ,查看的就是已暂存的修改,比较先后两个stage(暂存)之间的修改和变化,--staged 和 --cached 是同义词
$ git diff --cached diff --git a/aaa.txt b/aaa.txt new file mode 100644 index 0000000..6dad95f --- /dev/null +++ b/aaa.txt @@ -0,0 +1,6 @@ +aaa + + + + +bbb \ No newline at end of file
当暂存区域已经准备稳当能够提交了。在此以前,请必定要确认还有什么修改过的或新建的文件尚未 git add 过,不然提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 因此,每次准备提交前,先用 git status 看下,是否是都已暂存起来了, 而后再运行提交命令 git commit
$ git commit
若是想要更详细的对修改了哪些内容的提示,能够用 -v 选项,这会将所作的改变的 diff 输出放到编辑器中从而使你知道本次提交具体作了哪些修改。退出编辑器时,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)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过。
提交时记录的是放在暂存区域的快照。任何已经修改,但还未暂存(放到快照区(使用git add提交))的文件,在本次提交之中其所做的修改不会保存其中,而在下次添加到缓存区以后,才能够归入版本管理。 每一次运行提交操做,都是对项目做一次快照,之后能够回到这个状态,或者进行比较
跳过使用暂存区域
使用暂存区域的方式略显繁琐,Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把全部已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,而直接提交,可是,这种操做只是针对已经加入追踪的文件,对于从未加入追踪的文件,是不会加入追踪的,因此仍然须要git add xxx。以下,111.txt早已加入到追踪,修改以后,并未使用git add,而是直接使用git commit -a -m'commit without add step',而11tt.txt文件从未加入过追踪,因此直接提交的时候,对其不起做用,只能先加入追踪,之后才可使用直接提交的命令,为了保险起见,建议使用add步骤,而后提交
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ 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: 111.txt Untracked files: (use "git add <file>..." to include in what will be committed) 11tt.txt no changes added to commit (use "git add" and/or "git commit -a") hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit -a -m'commit without add step' [master 9d5b684] commit without add step 1 file changed, 3 insertions(+) hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) 11tt.txt nothing added to commit but untracked files present (use "git add" to track) hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git log commit 9d5b6842302a0b7d3fcb4d58f694cf19a9530972 (HEAD -> master) Author: hello <123456789@qq.com> Date: Thu Dec 28 14:38:07 2017 +0800 commit without add step
要从 Git 仓库中移除某个文件,就必需要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),而后提交。 能够用 git rm 命令完成此项工做,并连带从工做目录中删除指定的文件,在下一次提交以后,删除的文档就不会出如今跟踪文件清单中,可是当删除文件未提交时,仍然受跟踪,而且是deleted状态。注意的一点是,当使用了git rm 命令删除了某一文件以后,其会当即进入已追踪等待提交的状态,通过实验有无git add .都是能够的,『.』表示当前目录的全部文件,。以下例子中,删除了123.txt文件,而且提交以后显示此分支是clean的
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ ls 11tt.txt 123.txt aaa.txt odf.txt ppp.txt tt.py hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git rm 123.txt rm '123.txt' hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit -m'delete' [master 72d0b8b] delete 1 file changed, 1 deletion(-) delete mode 100644 123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master nothing to commit, working tree clean
git中的移动文件,其实也就是更名字+移动两个功能,使用mv命令来完成,格式是$ git mv file_from file_to,能够同一层级更名,也能够不一样层级更名+移动,运行 git mv 就至关于运行了以下3条命令
$ mv README.md README $ git rm README.md $ git add README
下面两个例子分别是不一样层级的移动和同级移动,s1是git仓库下的一个文件夹
# eg.1 hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ ls 11tt.txt aaa.txt hello.c p1.txt s1/ tt.py tt.txt wqe.py hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git mv aaa.txt s1/123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: aaa.txt -> s1/123.txt # eg.2 hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit -m 'move action' [master 63475c1] move action 1 file changed, 0 insertions(+), 0 deletions(-) rename aaa.txt => s1/123.txt (100%) hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git mv tt.txt tt1.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: tt.txt -> tt1.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit -m'mv rename' [master e56502a] mv rename 1 file changed, 0 insertions(+), 0 deletions(-) rename tt.txt => tt1.txt (100%)
最基本的查看提交历史的命令就是git log了,它会显示全部的历史,此时进入文本read-only模式(VIM),须要使用基本的进入,退出等操做,这个不在话下。git log命令常有不少 的参数,一个经常使用的选项是 -p,用来显示每次提交的内容差别。 加上 -2 来仅显示最近两次提交;--stat 选项在每次提交的下面列出全部文件的增删改和文件内容的增删改状况,这是基本经常使用的命令,其余命令能够查询
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git log -p -2 commit e56502a144d8f157dfc60296636089ee3235337b (HEAD -> master) Author: hello <123456789@qq.com> Date: Thu Dec 28 15:24:04 2017 +0800 mv rename diff --git a/tt.txt b/tt1.txt similarity index 100% rename from tt.txt rename to tt1.txt commit 63475c1e79f00f0b11c153a01bcb6fba26985d8a Author: hello <123456789@qq.com> Date: Thu Dec 28 15:21:42 2017 +0800 move action diff --git a/aaa.txt b/s1/123.txt similarity index 100% rename from aaa.txt rename to s1/123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git log --stat -3 commit e56502a144d8f157dfc60296636089ee3235337b (HEAD -> master) Author: hello <123456789@qq.com> Date: Thu Dec 28 15:24:04 2017 +0800 mv rename tt.txt => tt1.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) commit 63475c1e79f00f0b11c153a01bcb6fba26985d8a Author: hello <123456789@qq.com> Date: Thu Dec 28 15:21:42 2017 +0800 move action aaa.txt => s1/123.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) commit b627e58c45f055b6e64dcf79096cf802cbe982a3 Author: hello <123456789@qq.com> Date: Thu Dec 28 15:20:46 2017 +0800 213213 s1/qqq.txt | 1 + 1 file changed, 1 insertion(+)
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(后跟指定格式)。
提交后(未修改快照),修改提交信息
有时候咱们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,能够运行带有 --amend 选项的提交命令尝试从新提交
$ git commit --amend
这个命令会将暂存区中的文件提交。 若是自上次提交以来你还未作任何修改(例如,在上次提交后立刻执行了此命令),那么快照会保持不变,而修改的只是提交信息。若是提交后发现忘记了暂存某些须要的修改,能够像下面这样操做,(暂时没有演示,只展现命令)
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
最终只会有一个提交,也就是第二次提交将代替第一次提交的结果,以下
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git add mmm123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit -m 'add mmm123.txt' [master a575e22] add mmm123.txt 1 file changed, 1 insertion(+) create mode 100644 mmm123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git log -p -1 commit a575e2225c1b35411d133b1115bca6393290766e (HEAD -> master) Author: hello <123456789@qq.com> Date: Thu Dec 28 17:18:20 2017 +0800 add mmm123.txt # 提交的信息 diff --git a/mmm123.txt b/mmm123.txt new file mode 100644 index 0000000..6e9e156 --- /dev/null +++ b/mmm123.txt @@ -0,0 +1 @@ +1232132112312 \ No newline at end of file hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git commit --amend -m'add mmm123.txt hello' # 修改提交的信息 [master c97ccc3] add mmm123.txt hello Date: Thu Dec 28 17:18:20 2017 +0800 1 file changed, 1 insertion(+) create mode 100644 mmm123.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git log -p -1 commit c97ccc30c76e148bbc3ab2c07b64d10da9944f3e (HEAD -> master) Author: hello <123456789@qq.com> Date: Thu Dec 28 17:18:20 2017 +0800 add mmm123.txt hello # 修改了提交的信息 diff --git a/mmm123.txt b/mmm123.txt new file mode 100644 index 0000000..6e9e156 --- /dev/null +++ b/mmm123.txt @@ -0,0 +1 @@ +1232132112312 \ No newline at end of file
取消暂存文件,说明此时,文件已经被暂存起来了,也就是已经运行过了git add xxx命令,此时须要取消此次add,那么就须要使用git reset HEAD <file>命令,并且可若是一次存了多个文件,可使用具体的文件名,一个一个的取消,使用例子以下
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) mg.txt pt.txt nothing added to commit but untracked files present (use "git add" to track) hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git add . renjiaxin@PC-RENJIAXIN MINGW64 /e/Codes/gittest (master) $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: mg.txt new file: pt.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git reset HEAD mg.txt # 取消单个文件 hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: pt.txt Untracked files: (use "git add <file>..." to include in what will be committed) mg.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git add . hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: mg.txt new file: pt.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git reset HEAD . # 取消多个文件 hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) mg.txt pt.txt nothing added to commit but untracked files present (use "git add" to track)
此处所讲的撤销对文件的修改指的是本地的工做目录中的文件,此时工做目录中的文件已经修改,可是此时还未提交到git仓库之中,此时若是咱们想撤销全部对于工做目录中文件的修改,一个方法就是使用仓库中的文件,由于仓库中的文件没有修改过,因此咱们可使用它覆盖本地文件,可是这是一个很危险的动做,由于这样会让咱们的工做成果,在不经意之间化为乌有,因此必定要谨慎!撤销的命令为git checkout <file>,运行了此命令,本地文档的修改就被撤销。好比,文档sg.txt的内容原本以下123456,提交以后,又修改pt.txt的内容,在第3行添加654321 hello
hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) sg.txt nothing added to commit but untracked files present (use "git add" to track) hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git add . renjiaxin@PC-RENJIAXIN MINGW64 /e/Codes/gittest (master) $ git commit -m'sg 123456' [master 5257ed3] sg 123456 1 file changed, 1 insertion(+) create mode 100644 sg.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ 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: sg.txt no changes added to commit (use "git add" and/or "git commit -a") hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git checkout sg.txt hello@PC-HELLO MINGW64 /e/Codes/gittest (master) $ git status On branch master nothing to commit, working tree clean
获取远程的仓库,可使用git clone giturl来将远程的仓库复制到本地,查看远程仓库使用的是git remote,使用git remote -v,能够获取获得须要读写远程仓库使用的 Git 保存的简写与其对应的 URL。 origin是 Git 给克隆的仓库服务器的默认名字。添加一个远程Git仓库使用git remote add <shortname> <url> 命令,同时还能够指定一个轻松引用的简写,设定好简写以后,能够在命令行中使用设定的字符串来代替整个 URL,从远程服务器抓取仓库数据,可使用git fetch [remote-name],这样会访问远程仓库,而且从中拉取本地尚未的数据,获取其全部分支。若是使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 因此,git fetch origin 会抓取克隆(或上一次抓取)后新推送的全部工做。 注意 git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工做。有获取也有推送,当咱们更新了本地代码,就能够将其推送到远程仓库,使用git push [remote-name] [branch-name],好比想要将 master 分支推送到 origin 服务器时,那么运行git push origin master命令就能够将本地修改推送到远程服务器。若是想要查看某一个远程仓库的更多信息,可使用 git remote show [remote-name] 命令。若是想要重命名引用的名字能够运行 git remote rename oldname newname 去修改一个远程仓库的简写名,远程删除仓库的分支可使用git remote rm [branch-name]
$ git clone https://github.com/schacon/ticgit Cloning into 'ticgit'... remote: Reusing existing pack: 1857, done. remote: Total 1857 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done. Resolving deltas: 100% (772/772), done. Checking connectivity... done. $ git remote origin $ git remote -v origin https://github.com/schacon/ticgit (fetch) origin https://github.com/schacon/ticgit (push) $ git remote add pb https://github.com/paulboone/ticgit $ git remote -v pb https://github.com/paulboone/ticgit (fetch) pb https://github.com/paulboone/ticgit (push) $ git fetch pb remote: Counting objects: 43, done. remote: Compressing objects: 100% (36/36), done. remote: Total 43 (delta 10), reused 31 (delta 5) Unpacking objects: 100% (43/43), done. From https://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit $ git remote rename pb paul $ git remote origin paul $ git remote rm paul $ git remote origin
Git 能够给历史中的某一个提交打上标签,以示重要。列出标签只须要输入 git tag。Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。一个轻量标签很像一个不会改变的分支,它只是一个特定提交的引用。附注标签是存储在 Git 数据库中的一个完整对象。 它们是能够被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;而且可使用 GNU Privacy Guard (GPG)签名与验证。 一般建议建立附注标签,这样就能够拥有以上全部信息;可是若是只是想用一个临时的标签,或者由于某些缘由不想要保存那些信息,轻量标签也是可用的。 轻量标签本质上是将提交校验和存储到一个文件中 , 没有保存任何其余信息。 建立轻量标签,不须要使用 -a、-s 或 -m 选项,只须要提供标签名字。建立附注标签最简单的方式是当你在运行 tag 命令时指定 -a 选项,-m 选项指定了一条将会存储在标签中的信息,经过使用 git show 命令能够看到标签信息与对应的提交信息
$ git tag v0.1 v1.3 $ git tag v1.4-lw $ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5 $ git show v1.4-lw commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number $ git tag -a v1.4 -m 'my version 1.4' $ git tag v0.1 v1.3 v1.4 $ git show v1.4 tag v1.4 Tagger: Ben Straub <ben@straub.cc> Date: Sat May 3 20:19:12 2014 -0700 my version 1.4 commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number
ref:
1.1.3 起步 - Git 基础, 2.1.6 起步 - 初次运行 Git 前的配置, 3.1.7 起步 - 获取帮助, 4.2.1 Git 基础 - 获取 Git 仓库, 5.2.2 Git 基础 - 记录每次更新到仓库 6.2.3 Git 基础 - 查看提交历史, 7.2.4 Git 基础 - 撤消操做, 8.2.5 Git 基础 - 远程仓库的使用, 9.2.6 Git 基础 - 打标签