Git 入门

1,200 阅读5分钟

创建git仓库

在现有目录中初始化仓库

git init

这个命令将会在当前目录生成一个.git的隐藏文件夹。

克隆现有的仓库

git clone https://github.com/xxxx/abc

这会在当前目录下创建一个名为 “abc” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

git clone https://github.com/xxxx/ddd myname

这样拉取下来的仓库名称为myname

git的生命周期

检查当前文件状态

git stutas可以查看当前所有文件状态(初始化时分支什么也没有,显示如下):

➜  git git:(master) git statusgit status
位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

创建一个README.md的文件,执行git status

➜  git git:(master) ✗ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

        README.md

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

这个文件处于Untracked状态

跟踪新文件

通过git add命令添加为跟踪文件到暂存:

➜  git git:(master) ✗ git add README.md
➜  git git:(master) ✗ git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)

        新文件:   README.md

暂存已修改文件

当你修改了一个已跟踪的文件时:

➜  git git:(master) ✗ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

        新文件:   README.md

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

        修改:     modified

同样是通过git add添加到暂存区:

➜  git git:(master) ✗ git add modified 
➜  git git:(master) ✗ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

        新文件:   README.md
        修改:     modified

➜  git git:(master) ✗ 

git add是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件修改放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
如果你此时又修改了modified文件,可以看到modified同时出现在了暂存区和工作区:

➜  git git:(master) ✗ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

        新文件:   README.md
        修改:     modified

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

        修改:     modified

这是应为git实际上记录的是文件的修改信息,而不是文件本身,所以文件修改之后会产生新的修改信息,也就出现在了未提交暂存里。

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

git status只能提供仓库的概览,如果你想看具体的文件变更,需要使用git diff命令:

➜  git git:(master) ✗ git diff  
diff --git a/modified b/modified
index 7fde6c4..9de2b96 100644
--- a/modified
+++ b/modified
@@ -1 +1 @@
-阿斯顿发到付
\ No newline at end of file
+阿斯顿发到付asdfasdfasdf
\ No newline at end of file

git diff显示的是工作区和暂存区的区别,如果想查看暂存区和已提交的文件区别,使用git diff --cached或者git diff --staged


diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e739a05
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+asdfasdfsf
\ No newline at end of file
diff --git a/modified b/modified
index e69de29..7fde6c4 100644
--- a/modified
+++ b/modified
@@ -0,0 +1 @@
+阿斯顿发到付
\ No newline at end of file

提交更新

直接运行git commit会弹出一个shell窗口默认的编辑器来提交编辑信息:

  GNU nano 2.9.7                                                             /home/vongola/Documents/demo/git/.git/COMMIT_EDITMSG                                                                     


# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 位于分支 master
# 要提交的变更:
#       新文件:   README.md
#       修改:     modified
#






                                                                                           [ 已读取 9 行 ]
^G 求助           ^O 写入           ^W 搜索           ^K 剪切文字       ^J 对齐           ^C 游标位置       M-U 撤销          M-A 标记文字      M-] 至括号        M-▲ 上一个        ^B 向后
^X 离开           ^R 读档           ^\ 替换           ^U 还原剪切       ^T 拼写检查       ^_ 跳行           M-E 重做          M-6 复制文字      M-W 搜索下一个    M-▼ 下一个        ^F 向前

也可以通过git commit -m的方式提交一条信息:

➜  git git:(master) ✗ git commit -m 'commit readme'
[master 2aefec9] commit readme
 2 files changed, 2 insertions(+)
 create mode 100644 README.md

**请记住,提交时记录的是放在暂存区域的快照。 任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。    **
git commit -am可以将添加到暂存和提交更新合并为一个操作:

➜  git git:(master) ✗ git commit -am 'commit readme'
[master 31113ac] commit readme
 1 file changed, 1 insertion(+)
➜  git git:(master) ✗ 

移除文件

git rm会把文件从已跟踪文件清单中移除(确切地说,是从暂存区域移除),并且会删除文件本身:

➜  git git:(master) ✗ git rm modified 
rm 'modified'
➜  git git:(master) ✗ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

        删除:     modified

此时modified的文件已经从工作区中删除,但是在git中还存在,需要commit这次删除文件的提交。

有的时候,我们不小心提交了一些编译文件,想把它从git中删除,但是并不想把它从工作区删除,那么使用
--cached 选项:

➜  git git:(master) git rm modified --cached                                 
rm 'modified'
➜  git git:(master) ✗ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

        删除:     modified

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

        modified

➜  git git:(master) ✗ 

这个时候会比不添加--cached的文件多一个未跟踪的modified,此时把它添加到.gitignore中就能够不在跟踪了。(删除的暂存和上面一样需要提交到git)。
综上所述,大家在结合git的声明周期图就能够明白git的工作流程了。