Git版本控制基础(在更)

本文详细介绍了Git版本控制系统的使用,包括初始化仓库、克隆远程仓库、跟踪与暂存文件、提交更新、查看文件状态、忽略文件、查看提交历史、撤销操作、远程仓库的管理和标签的使用。此外,还涵盖了Git的常用命令,如gitstatus、gitadd、gitcommit、gitpush、gitfetch、gitpull等,以及如何添加、删除和重命名远程仓库。
摘要由CSDN通过智能技术生成

Git版本控制图

在这里插入图片描述

  • 团队协作版本控制流程
    在这里插入图片描述

获取Git项目仓库

以下两种方式都会在本地机器上得到一个工作就绪的Git仓库

将尚未进行版本控制的本地目录转换为Git仓库
  • cd到项目目录内
    • 执行git init,该命令将创建一个名为,git的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件
    • 通过git add [文件],来指定所需文件进行追踪
    • 执行git commit -m [分支提交说明]
从其他服务器克隆一个已经存在的Git仓库
  • git clone <url>,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来
  • 自定义克隆远程仓库在本地仓库的名字
    • git clone <url> [名字]

记录每次更新到仓库

工作目录下的每个文件都不外乎两种状态:已跟踪未跟踪

已跟踪的文件,是指那些被纳入版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是Git已经知道的文件。
未跟踪的文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。初次克隆某个仓库的时候,工作目录的所有文件都属于已跟踪文件,并处于未修改状态。

  • 文件的状态变化周期
    在这里插入图片描述
检查当前文件状态
  • git status命令查看哪些文件处于什么状态,如克隆仓库后立即使用该命令。
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    nothing to commit, working directory clean
    
    如在项目下创建一个新的README,使用该命令,将会看到一个新的未跟踪的文件,会提示Untracked files
    $ 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命令开始跟踪一个文件,跟踪README文件,运行
    git commit README
    
    此时运行git status命令,会提示Changes to be committed
    $ 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
    
暂存已修改的文件

如果修改一个已被跟踪的文件,运行git status命令,会提示Changes not staged for commit,并且提示我们需要把CONTRIBUTING.md文件放入暂存区。

$ 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)

    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

往下执行,提示已暂存。

$ git add CONTRIBUTING.md
$ 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)

    new file:   README
    modified:   CONTRIBUTING.md

若继续在该文件中修改内容,则需要重新放入暂存区。

状态简览
  • git status -sgit status -short 命令,将得到格式更为紧凑的输出。
    $ git status -s
     M README                     // 文件已修改但尚未暂存
    MM Rakefile                   // 文件已修改,暂存后又做了修改,文件中既有已经暂存的部分,又有未暂存的部分
    A  lib/git.rb                 // 文件已暂存
    M  lib/simplegit.rb           // 文件已修改且已经暂存
    ?? LICENSE.txt
    
  • 新添加的未跟踪文件前面有 ?? 标记
  • 新添加到暂存区中的文件前面有 A 标记
  • 修改过的文件前面有 M 标记
  • 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态
忽略文件

一般我们总会有些文件无需纳入Git管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件。我们可以创建一个名为.gitignore的文件,列出要忽略的文件的模式,例如:

$ cat .gitignore
*.[oa]               // 告诉Git忽略所有以.o 或 .a 结尾的文件, 一般这些文件都是在编译过程中出现的
*~                    // 告诉Git忽略所有名字以波浪符(~)结尾的文件

要养成一开始就为新仓库设置好.gitignore的习惯,以免将来误提交这类无用的文件。
文件.gitignore文件的格式规范:

  • 所有空行或者以 # 开头的行都会被git忽略
  • 可以使用标准的 glob 模式匹配,即shell所使用的简化了的正则表达式,它会递归地应用在整个工作区中
  • 匹配模式可以以 / 开头防止递归
  • 匹配模式可以以 / 结尾指定目录
  • 要忽略指定模式以外的文件或目录,可以在模式前加感 ! 取反
查看已暂存和未暂存的修改
  • git diff 命令能通过文件补丁的格式更加具体地显示哪些行为发生了改变,比较的是工作目录中当前文件和暂存区域快照之间的差异。
  • git diff --stagedgit diff --cached 命令对比已暂存文件与最后一次提交的文件的差异。
提交更新

暂存区准备就绪了,就可以提交了。准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了,然后再运行提交命令 git commit

  • git commit -m 添加 -m 选项,将提交信息与命令放在同一行。

提交时记录的是放在暂存区的快照。每一次运行提交操作,都是对你的项目作一次快照,以后可以回到这个状态,或者进行比较。

移除文件

要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(即从暂存区中移除),然后提交,可以使用 git rm 命令,并连带从工作目录中删除指定的文件。

  • 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f。这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被Git恢复。

  • git rm --cached README 使用 --cached 选项,可以让文件保留在磁盘,但是并不想让Git继续跟踪。

  • git rm 命令后可以列出文件或者目录的名字,也可以使用 glob 模式。

移动文件

同Linux系统中的 mv 操作

 

查看提交历史

查看提交历史
  • git log 命令,会按时间先后顺序列出所有的提交,以及SHA-1校验和、作者的名字和电子邮件、提交时间以及提交说明等,如:

    $ 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
    
  • -p--patch 选项,会显示每次提交所引入的差异。-n限制显示的日志数量,如限制2条日志显示。

    $ git log -p -2
    
  • --pretty 选项,可以使用不同于默认格式的方式展示提交历史。比如 online 会将每个提交放在一行显示。

    $ git log --pretty=oneline
    ca82a6dff817ec66f44342007202690a93763949 changed the version number
    085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
    a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
    
    • format,可以定制记录的显示格式。
      $ 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
      
    • format 常用选项。
    选项说明
    %H提交完整的哈希值
    %h提交简写的哈希值
    %T树的完整哈希值
    %t树的简写哈希值
    %P父提交的完整哈希值
    %p父提交的简写哈希值
    %an作者的名字
    %ae作者的电子邮件地址
    %ad作者修订日期(可以用 --date= 选项 来定制格式)
    %ar作者修订日期(按多久以前的方式显示)
    %cn提交者的名字
    %cd提交日期
    %cr提交日期(距今多长时间)
    %s提交说明
  • --graph 选项可以可视化地显示提交的分支、合并历史。

    $ git log --pretty=format:"%h %s" --graph
    * 2d3acf9 ignore errors from SIGCHLD on trap
    *  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
    |\
    | * 420eac9 Added a method for getting the current branch.
    * | 30e367c timeout code and tests
    * | 5a09431 add timeout protection to grit
    * | e1193f8 support for heads with slashes in them
    |/
    * d6016bc require time for xmlschema
    *  11d191e Merge branch 'defunkt' into local
    

撤销操作

撤销操作
  • 有时我们工作提交完了才发现漏掉几个文件没有添加,或者提交信息写错了,此时可以运行带有 --amend 选项的提交命令来重新提交。
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend
    
    最终只会有一个提交—第二次提交将代替第一次提交的结果。
  • Note:当你在修补最后的提交时,并不是通过用改进后的提交 原位替换 掉旧有提交的方式来修复的, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。
取消暂存的文件
$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md
  • 在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD <file>... 来取消暂存。
  • Notegit reset 确实是个危险的命令,如果加上了 --hard 选项则更是如此。
撤销对文件的修改
  • 在未暂存区域中,使用git checkout -- <filename>
  • Note:这个命令很危险,你对那个文件在本地的任何修改都会消失—Git会用最近提交的版本覆盖掉它。除非你确实清楚不想要对那个文件的本地修改了,否则不要使用这个命令。

远程仓库的使用

远程仓库的使用

远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。

  • 远程仓库可以在本地主机上
查看远程仓库

git remote 命令,查看已经配置的远程仓库服务器。

$ git remote
origin

指定 -v 选项,会显示需要读写远程仓使用的Git保存的简写与其对应的URL。

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
添加远程仓库

git remote add <shortname> <url> 命令,添加一个新的远程Git仓库,同时指定一个方便使用的简写(shortname)。现在可以使用字符串 pb 来代替整个URL。

$ 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

现在远程仓库的master分支可以在本地通过 pb/master 访问到

从远程仓库中抓取与拉取

git fetch <remote> 命令,从远程仓库中获得数据,注意该命令只会将数据下载到本地仓库—它并不会自动合并或修改你当前的工作。你必须使用 git pull 命令,来自动抓取后合并远程分支到当前分支。

  • 默认情况下,git clone 命令会自动设置本地master分支跟踪克隆的远程仓库的 master 分支(或其他名字的默认分支)。
推送到远程仓库

当你想分享你的项目时,必须将其推送到上游。执行 git push <remote> <branch> 命令,将 master 分支推送到 origin 服务器。

$ git push origin master

Note:只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先抓取 fetch 它们的工作并将其合并 pull 进你的工作后才能推送。

查看某个远程仓库

git remote show <remote> 命令,查看某一个远程仓库的更多信息。

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master                        
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

它告诉你正处于本地 master 分支。

 Local branches configured for 'git pull':
   dev-branch merges with remote dev-branch
   master     merges with remote master
 Local refs configured for 'git push':
   dev-branch                     pushes to dev-branch                     (up to date)
   markdown-strip                 pushes to markdown-strip                 (up to date)
   master                         pushes to master                         (up to date)

这个命令列出了当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了, 还有当你执行 git pull 时哪些本地分支可以与它跟踪的远程分支自动合并

远程仓库的重名与删除

git remote rename命令,来修改一个远程仓库的简写名。

$ git remote rename pb paul          // 将pb重命名为paul
$ git remote
origin
paul

git remote remove命令, 来移除一个远程仓库

$ git remote remove paul
$ git remote
origin

一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支的远程跟踪分支以及配置信息也会一起被删除。

打标签

Git可以给仓库历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布节点(v1.0v2.0等等)。

列出标签

git tag 命令,列出标签

$ git tag
v1.0
v2.0

支持shell通配符(glob模式),按照通配符列出标签需要-l 选项。如果提供一个匹配标签名的通配模式,那么 -l 就是强制使用的。

$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
创建标签

Git支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

轻量标签很像一个不会改变的分支—它只是某个特定提交的引用。它没有保存任何其它信息。

附注标签是存储在Git数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。

附注标签

git tag -a命令,创建附注标签只需要加上 -a 选项,-m 选项指定一条将会存储在标签的信息:

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

git show 命令,可以看到标签信息和与之对应的提交信息

$ 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

输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息

轻量标签

创建轻量标签,不需要使用 -a-s-m 选项,只需要提供标签名字:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

轻量标签上运行 git show <tagname> ,不会看到额外的标签信息,只会显示出提交信息。

后期打标签

在之后补上标签,即在指定提交上打标签,需要在命令的末尾指定提交的校验和(或部分校验和):

$ git tag -a v1.2 9fceb02
共享标签

默认情况下git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显示地推送标签到共享服务器上。可以运行git push origin <tagname>命令。

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

若想一次性推送很多标签,使用带有 --tags 选项的 git push 命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

如此,当其他人从仓库中克隆或拉取,它们也能得到你的那些标签
Note:使用 git push <remote> --tags 推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。

删除标签

git tag -d <tagname>,即可删掉在本地仓库上的标签。

若想要从任何远程仓库中移除这个标签,必须用 git push <remote> :refs/tags/<tagname>

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

删除远程标签方法二:git push origin --delete <tagname>

检出标签

如果你想查看某个标签所指向的文件版本,可以使用 git checkout 命令, 虽然这会使你的仓库处于“分离头指针(detached HEAD)”的状态。

Git别名

可以通过 git config 文件来轻松地为每一个命令设置一个别名:

$ git config --global alias.co checkout         
$ git config --global alias.br branch
$ git config --global alias.ci commit                 // 可以用 git ci 来代替 git commit 了
$ git config --global alias.st status

例如:

$ git config --global alias.last 'log -1 HEAD'

这样,可以轻松地看到最后一次提交:

$ git last
commit 66938dae3329c7aebe598c2246a8e6af90d04646
Author: Josh Goebel <dreamer3@example.com>
Date:   Tue Aug 26 19:48:51 2008 +0800

    test for current head

    Signed-off-by: Scott Chacon <schacon@example.com>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值