zoukankan      html  css  js  c++  java
  • 建立仓库并提交更新

    建立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
    
    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    面试点滴
    算法之归并排序
    博客园代码高亮样式更换-测试
    MacOS 10.12 设置找不到 任何来源 的话 这么操作 教程
    HTTP代理协议 HTTP/1.1的CONNECT方法
    Linux命令
    Linux命令
    Linux命令
    vmware虚拟机linux桥接模式设置
    GDB调试 (七)
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/git-repository.html
Copyright © 2011-2022 走看看