[关闭]
@nextleaf 2018-11-08T18:05:56.000000Z 字数 5441 阅读 693

版本控制系统Git

Git


建议使用标准的UTF-8编码(UTF-8 without BOM),避免使用记事本修改项目文件

Git安装

下载地址 https://git-scm.com/downloads

初始化配置,在命令行或Git Bash中配置你的用户名和密码:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

在 Windows 系统上,如果要在提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF),用

git config --global core.autocrlf true

来打开此项功能

Git使用

1.创建版本库(.Git)

在项目根目录下【请确保目录名(包括父目录)不包含中文】使用命令

git init

来初始化版本库

2.把文件添加到版本库

2.1把文件(单个或多个,单次或多次)添加到仓库,在工作区(项目目录)下执行命令

git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件

git add file2.txt file3.jsp file3.xml file4.java mysql.properties
/*可以使用参数-f强制添加*/

示例-添加documentation目录及其子目录下所有*.txt文件的内容:

git add documentation/*.txt

把工作区的所有变化提交到暂存区(不包括被删除的文件)

git add . 

2.2把添加的文件提交到仓库,在工作区下执行命令

git commit -m "提交说明说明"

项目文件修改后,也是通过这两个命令提交修改
git status命令可以查看仓库当前的状态,如果git status告诉你有文件被修改过,可用git diff [file]查看修改内容

git log命令查看修改记录,加上--pretty=oneline参数可简化输出。(一长串字符代表提交版本号,HEAD指示当前版本)

3.回退版本

git reset --hard HEAD^      回退到上一个版本
git reset --hard [commit id]    恢复到指定版本

git reflog  查看命令历史纪录,以便恢复到指定版本
git checkout -- file    让file这个文件回到最近一次git commit或git add时的状态
git reset HEAD [file]   可以把暂存区file的修改撤销掉(unstage),重新放回工作区

【场景1】:
当你改乱了工作区某个文件的内容(或误删文件),想直接丢弃工作区的修改时,用命令git checkout -- [file]
【场景2】:
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD [file],就回到了场景1,第二步按场景1操作。
【场景3】:
已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库

4.从版本库中删除文件

删除后只能恢复文件到曾提交的最新版本

git rm test.txt
rm 'test.txt'

5.远程仓库

远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。

6.添加远程库

git remote add origin [address]

7.把分支的所有内容推送到远程库上

头一次推送,使用-u参数:git push -u origin master
以后:git push origin master
master是分支名称

克隆远程库:git clone [address]

8.创建分支

git checkout -b dev dev是分支名,加上-b参数表示创建并切换到,相当于以下两条命令
git branch dev
git checkout dev

git branch命令会列出所有分支,当前分支前面会标一个*号

还可以使用已有标签来创建分支git checkout -b [branchname] [tagname]

切换分支:

git checkout [branchname]

9.合并分支

git merge   命令用于合并指定分支到当前分支:
git merge dev   dev分支的工作成果合并当前分支上

删除分支,参数d为大写时,强制删除:git branch -d [branchname]

10.解决冲突

文件又冲突时,合并会失败并提示冲突文件,git status也可以告诉我们冲突的文件
修改后,再把文件添加和提交

git log --graph命令可以看到分支合并图

通常合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息
强制禁用Fast forward模式,Git会在merge时生成一个新的commit,合并后的历史有分支,能看出来曾经做过合并

git merge --no-ff -m "描述描述" dev
--no-ff参数,表示禁用Fast forward

合并后,可用git log查看分支历史

master分支应当是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活都在其他分支上,完善后再--no-ff合并到master上】

11.Bug分支

git stash可以把当前工作现场“储藏”起来,等以后恢复现场(git stash pop)后继续工作

【场景】:dev分支开发到一半,master分支有bug要修复
示例步骤:

git stash 保存现场
git checkout master 切换到master
git checkout -b issue-101 创建并切换bug分支issue-101
修复,提交
git checkout master 切换到master
git merge --no-ff -m "修复bug 101" issue-101 合并到master
删除issue-101分支
git checkout dev 切换到dev分支
git stash list 查看工作现场列表
git stash apply stash@{0} 恢复指定现场,恢复后stash内容并不删除,可以用git stash drop来删除
另一种方式是用git stash pop,恢复的同时把stash内容也删了

12.多人协作

要查看远程库的信息,用git remote
或者用git remote -v显示更详细的信息(如果没有推送权限,就看不到push的地址)

12.1抓取分支(git pull)

在本地创建和远程分支对应的分支:

git checkout -b dev origin/dev

建立本地分支和远程分支的关联:

git branch --set-upstream-to=origin/[branchname] [branchname]

把分支推送到远程:

git push origin dev

推送出现冲突时,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

如果git pull也失败了,需要定本地dev分支与远程origin/dev分支的链接(关联),

git branch --set-upstream-to=origin/dev dev

git pull,此时若出现合并冲突,需要手动解决,解决后,提交,再push

【多人协作的工作模式通常是这样的】:

首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则可能因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin [branch-name]推送就能成功!
如果git pull提示'no tracking information...',则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to [branchname] origin/[branchname]

13.Rebase

Rebase只对尚未推送的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作】

git log --graph --pretty=oneline --abbrev-commit    查看分支合并图
git rebase                      把分叉的提交历史“整理”成一条直线,看上去更直观
git push origin branch-name     把本地分支推送到远程
git log --graph --pretty=oneline --abbrev-commit

14.标签管理

Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
一个轻量标签很像一个不会改变的分支(分支可以移动,标签不能移动),它只是一个特定提交的引用(指向某个commit的指针);而附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。

发布一个版本时,通常先在版本库中打一个标签(tag),将来取某个标签的版本,就是把那个打标签的时刻的历史版本取出来

14.1列出标签(以字母顺序列出标签)

git tag

14.2创建标签

首先,切换到需要打标签的分支上(git checkout [branchname])。
创建一个附注标签最简单的方式是当你在运行 tag 命令时指定 -a 选项

git tag -a v1.4 -m 'my version 1.4'

-m 选项指定了一条将会存储在标签中的信息
使用 git show [tag]命令可以看到标签信息与对应的提交信息

轻量标签,只需要提供标签名字:

git tag [tag-name]

对过去的提交打标签

git log --pretty=oneline --abbrev-commit
git tag -a v1.2 [commit-id]

14.3删除标签

git tag -d [tagname]

如果远程仓库也有要删除:先删除本地,再

git push origin :refs/tags/[tagname]

14.4共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上
需要显式地推送(某个)标签:

git push origin [tagname]

把所有不在远程仓库服务器上的标签全部传送到那里:

git push origin --tags      

在特定的标签上创建一个新分支:

git checkout -b [branchname] [tagname]

15.第三方托管

15.1使用GitHub

(先注册并登录一个GitHub账号)
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可将Fork后的仓库clone到本地;
本地修改后往自己的仓库推送;
在GitHub上,可以推送pull request给官方仓库来贡献代码。

github添加-新建-SSH key
1.使用git或GitHub Desktop生成密钥对,
例如:

ssh-keygen -t rsa -b 4096 -C "nextleaf@outlook.com"

2.访问https://github.com/settings/keys,点击右上角new SSH key按钮
3.取个名字,名字一般是生成密钥对时填写的邮件地址,粘贴公钥内容,比如id_rsa.pub的。
4.点击add SSH key按钮。

15.2使用码云

国内使用GitHub时,经常会访问速度慢,码云则没有这个问题。
码云添加SSH key步骤与github添加的步骤类似

git remote -v 查看远程库信息(查看是否已关联远程库)

删除已有的GitHub远程库:

git remote rm origin

再关联码云的远程库(注意路径中需要填写正确的用户名):

git remote add origin [url]

也可以既关联GitHub,又关联码云:
先删除已关联的名为origin的远程库:

git remote rm origin

关联GitHub的远程库:

git remote add github [url]

再关联码云的远程库:

git remote add gitee [url]

git remote -v查看远程库信息,可以看到两个远程库

如果要推送到GitHub,使用命令:

git push github master

如果要推送到码云,使用命令:

git push gitee master

16.忽略特殊文件

在工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
如:

  1. # Compiled class file
  2. *.class
  3. # Log file
  4. *.log
  5. # Package Files #
  6. *.jar
  7. *.war
  8. *.nar
  9. *.ear
  10. *.zip
  11. *.tar.gz
  12. *.rar
  13. # Windows
  14. Thumbs.db
  15. ehthumbs.db
  16. Desktop.ini

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它.

17.配置命令别名

参见这里


以上Git教程摘自廖雪峰的官方网站 https://www.liaoxuefeng.com/
若发现教程有误,可参考Git官方在线文档 https://git-scm.com/book/zh/v2

另一个教程易百教程

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注