Git基础

分布式版本控制工具

初始化本地库

  1. git init

在要初始化的目录下右键 Git bash进入, 输入命令

image.png

查看状态

  1. git status

Git - 图2

表明文件还只存在工作区, 没有被跟踪

将文件添加到暂存区

  1. git add filename

Git - 图3

文件被添加到暂存区后, 显示如上图所示, 文件名变成了绿色

将文件从暂存区删除

  1. git rm --cached filename

不会删除本地库的文件, 只会删除暂存区的文件

取消暂存的文件

  1. git reset HEAD <file>...
  1. $ git add *
  2. $ git status
  3. On branch master
  4. Changes to be committed:
  5. (use "git reset HEAD <file>..." to unstage)
  6. renamed: README.md -> README
  7. modified: CONTRIBUTING.md
  8. $ git reset HEAD CONTRIBUTING.md
  9. Unstaged changes after reset:
  10. M CONTRIBUTING.md
  11. $ git status
  12. On branch master
  13. Changes to be committed:
  14. (use "git reset HEAD <file>..." to unstage)
  15. renamed: README.md -> README
  16. Changes not staged for commit:
  17. (use "git add <file>..." to update what will be committed)
  18. (use "git checkout -- <file>..." to discard changes in working directory)
  19. modified: CONTRIBUTING.md

提交本地库

  1. git commit -m "log message" filename"
  2. git commit -a -m "log message" filename" # 不需要添加到暂存区

使用以上的命令, 将暂存区的文件提交, -m 后面添加日志信息

修改文件后提交

在本地库中修改文件后, 需要使用git add filename再次跟踪文件, 然后再使用git commit… 命令将文件提交

覆盖上次的提交

  1. $ git commit -m 'initial commit'
  2. $ git add forgotten_file
  3. $ git commit --amend

最终你只会有一个提交——第二次提交将代替第一次提交的结果。

版本穿梭

  1. git reset --hard versionid 放弃所有的历史, 改回指定提交

引用回到versionid, 工作区和暂存区会退回到versionId的状态, 自versionId以来的提交全部丢失

文件的撤销和版本的回退

文件的撤销和版本的回退

git checkout --file_name利用暂存区的文件覆盖工作区的文件
git checkout head --file_name利用head所指的commit版本覆盖工作区, 暂存区
git reset head --file_name利用head所指的commit版本覆盖暂存区的文件
git reset --hard [head^](回退到上一个版本)[commit_id](回退到某一版本)...回退到某一版本, 工作区和暂存区的文件也会回去
git reflog查看所有的log信息

Git - 图4

打标签

Git支持两种标签:

  1. 轻量标签(lightweight)

作为临时标签使用

  1. 附注标签(annotated)

是Git中完整的对象, 可以被校验的, 其中包括打标签者的名字, email, 日期, 还有一个标签信息.

列出所有的标签

  1. git tag
  2. git tag -l "v1.8.5*" //使用通配符查找以v1.8.5开头的标签

创建标签

  1. $ git tag -a v1.4 -m "my version 1.4" # 附注标签
  2. $ git tag v1.4-lw # 轻量标签
  3. $ git tag
  4. v0.1
  5. v1.3
  6. v1.4

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

  1. $ git show v1.4
  2. tag v1.4
  3. Tagger: Ben Straub <ben@straub.cc>
  4. Date: Sat May 3 20:19:12 2014 -0700
  5. my version 1.4
  6. commit ca82a6dff817ec66f44342007202690a93763949
  7. Author: Scott Chacon <schacon@gee-mail.com>
  8. Date: Mon Mar 17 21:52:11 2008 -0700
  9. changed the version number

后期打标签

  1. $ git log --pretty=oneline # 查看log
  2. 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
  3. 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
  4. 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
  5. $ git tag -a v1.2 9fceb02
  6. # 后面六位是校验和

共享标签

git push不会传送标签到远程库上, 需要手动在命令后添加

  1. $ git push origin v1.5

删除标签

  1. $ git push origin --delete <tagname>

Git别名

Git别名

分支操作

基本命令

  1. git branch branch_name 创建分支
  2. git branch -v 查看每个分支的最后一次提交
  3. git checkout branch_name 切换到指定分支
  4. git checkout -b branch_name 创建新的分支,并切换过去
  5. git merge branch_name 将指定的分支切合并到当前的分支
  6. git branch --merged/no-merged 查看已经已经合并/没有合并的分支
  7. git branch -d branch_name 删除指定分支
  8. git diff [first-branch]...[second-branch] 展示两个分支之间的内容差别
  9. git log --oneline --decorate 查看各个分支当前所指的对象
  10. git lon --oneline --decorate --graph --all 输出提交历史, 各个分支的指向以及项目的分支情况

Git - 图5

在Second版本时创建一个hot-fix分支, 此时Master和hot-fix分支都指向second版本, head指向master分支, 可以使用分支转换命令切换到hot-fix分支, 此时在版本上的操作结果只存在于hot-fix, 对Master分支没有影响, 如果再切换到master分支, 那么当前的版本还是second, 如果再使用分支合并命令, 在master分支上, 将hot-fix分支合并, 那么此时的master指向hot-fix指向的版本, 产生一下两种结果, 没有冲突和有冲突

分支合并没有冲突

正常合并, 不产生错误的结果

分支合并有冲突

  1. <<<<<<< HEAD:index.html
  2. <div id="footer">contact : email.support@github.com</div>
  3. =======
  4. <div id="footer">
  5. please contact us at support@github.com
  6. </div>
  7. >>>>>>> iss53:index.html

这表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分 (======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分 。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。 例如,你可以通过把这段内容换成下面的样子来解决冲突:

  1. <div id="footer">
  2. please contact us at email.support@github.com
  3. </div>

需要将其中的<<<<<,======删除

合并分支时, 两个分支在同一个文件有两套完全不同的修改, Git无法决定, 那么这时候需要人为的决定

团队协作

团队内协作

Git - 图6

跨团队协作

Git - 图7

远程库

给远程库起别名

  1. git remote add alias url(自己的远程库连接)

远程仓库的重命名

  1. git remote rename old_name new_name

值得注意的是这同样也会修改你所有远程跟踪的分支名字。 那些过去引用 pb/master 的现在会引用 paul/master

移除远程仓库

  1. git remote remove paul

查看远程库别名和url

  1. git remote -v

将本地分支推送到远程库

  1. git push alias(远程库别名或者是连接) local_branch(本地分支名)

首先始要使用git add, git commit 将文件提交到本地库, 然后再使用上面的命令, 否则会报错

将远程库拉取到本地库

  1. git pull alias local_branch [--allow-unrelated-histories]
  2. git fetch alias

pull: 拉去并合并分支
fetch: 拉去但不合并
最好是已经克隆了远程库, 否则会报错, 要使中括号中的内容

中括号中是在远程库和本地库不一致的时候使用的命令.

克隆

  1. git clone url