建立仓库并提交更新

建立Git仓库

为现有的项目建立Git仓库

要对现有的项目使用git管理,只需要到项目所在的目录,执行:

git init`

就可以初始化一个新的仓库,在当前目录下会有一个.git目录,保存了Git需要的所有数据和资源,如果你想要将目录中的文件纳入版本控制,需要先用git add告诉Git需要对这些文件进行跟踪。

git add *.c
git add README
git commit -m 'initial project version'

从现有仓库克隆

如果你想对某个开源项目出一份力,可以先把该项目的git仓库克隆一份,用到的命令就是git clone,这里的克隆是服务器上这个项目的所有文件,包含之前的版本,更改记录等。因此即使服务器发生故障,任何一个克隆出来的版本也能保证数据不丢失。
命令为git clone [url]

$ git clone git://github.com/schacon/grit.git

这个命令会在当前目录创建一个grit目录作为项目目录,你也可以指定克隆后项目的路径和名字,例如

$ git clone git://github.com/schacon/grit.git mygrit

上面的命令会把克隆后的项目grit重命名为mygrit

向仓库提交更新

现在我们已经有了一个Git仓库,并从仓库中取出了文件的工作拷贝。接下来我们会修改一些文件,完成一个阶段的目标后再向仓库提交本次更新。

工作目录中的所有文件都只有 已跟踪或未跟踪两种状态。

  • 已跟踪是指文件被纳入版本控制,快照中有它的记录,工作一段时间后状态可能是未更新、已修改或是已放入暂存区。
  • 未跟踪的文件既没有快照,也不在暂存区

刚克隆仓库时,工作目录的所有文件都是已跟踪文件,状态为未修改。

文件状态的变更周期如下图所示:

检查当前文件状态

git status命令用于查看当前状态,如果在克隆仓库后执行次命令,你会看到类似这样的输出

$ git status
On branch master
nothing to commit, working directory clean

上面输出的意思是:当前处在master分支,没有任何处于未跟踪的新文件。

如果我们新建一个文件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)

可以看到README处于untracked状态,暂存区没有文件需要提交。

通过git add README跟踪一个新文件,此时查看状态:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README

可以看到README已经处在待提交状态。

暂存已修改的文件

如果我们修改一个已处于跟踪的文件benchmarks.rb,再次查看git的状态

$ 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:   benchmarks.rb

可以看到benchmarks.rb的状态是修改但未放到暂存区。我们还需要用git add benchmarks.rb来文件的修改放到暂存区

$ git add benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README
        modified:   benchmarks.rb

此时提交就会将两个文件一并提交到仓库。那么,如果我们在这是再次修改benchmarks.rb会怎样?

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README
        modified:   benchmarks.rb

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:   benchmarks.rb

可以看到benchmarks.rb出现了两次,一次已经暂存,一次没有暂存。此时提交只会提交上次git add的版本而非此时工作区的版本,除非再次执行git add benchmarks.rb

$ git add benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README
        modified:   benchmarks.rb

忽略某些文件

有时候我们不希望跟踪某些文件的变化,我们不希望它们每次都出现在未跟踪列表里,此时我们可以创建一个名为.gitignore的文件,列出要忽略的文件的模式,例如:

$ cat .gitignore
*.[oa]
*~

第一行表示忽略以.a.o结尾的文件。第二行表示忽略以~结尾的文件。

.gitignore文件的格式规范:

  1. 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  2. 可以使用标准的 glob 模式匹配(shell 所使用的简化了的正则表达式)。
  3. 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  4. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

一个.gitignore文件例子:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

查看已暂存和未暂存的更新

git diff会以文件补丁的形式列出具体添加和删除的行
直接执行git diff不加任何参数会比较当前工作文件和暂存区快照之间的差异,也就是修改后还没有暂存的内容变化。

若要查看暂存的文件和上次提交的快照之间的差异,可以用git diff --cached

提交更新

最终我们都需要将暂存区的文件提交到仓库,在这之前请确定你的修改都用git add 添加到暂存区,否则仓库不会记录变更。

git -commit -m "message"

-m 后的内容记录这次提交的log,以便你回退时知道这次哪次提交,做了哪些改变。

跳过暂存区直接提交

如果你认为先提交到暂存区非常繁琐或是没有必要,也可以直接提交到仓库,只要在git commit加上-a参数就会把所有已跟踪的文件暂存起来一并提交。

移除文件

由Git接管了你的版本控制后,任何对文件的增删修改Git都会提醒你,如果你在工作目录中删除了一个文件,运行git status时就会由“Changes not staged for commit” 提醒你有修改没有提交,因此如果你要从Git中移除某个文件,直接使用git rm命令代替rm,它不光会从工作目录中删除指定文件,而且会从已跟踪文件清单中移除。

还有另外一种情况,你想要从跟踪清单中删除但不想从工作目录中删除,比如一些日志文件,或者一些.a编译文件,被你不小心纳入仓库,此时要移除跟踪但不要删除文件,以便稍后在.gitignore文件中补上,此时只要加上--cached选项即可。

$ git rm --cached logs

重命名文件

同删除文件一样,重命名文件也需要更改Git的暂存区,因此我们不能直接用mv在工作目录中对文件重命名,也许你已经想到了,正确的命令是git mv file_old file_new

其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.txt README
$ git rm README.txt
$ git add README
posted @ 2017-10-01 21:56  lepeCoder  阅读(397)  评论(0编辑  收藏  举报