欢迎使用Wiki,如果您在使用过程遇到什么问题,请联系我

创建版本库

cd
git init
touch readme.txt
git add readme.txt
git commit -m "增加一个说明文档"
git status

git init用于创建一个版本库,执行完后,在当前目录会生成一个.git的文件夹,这个目录是Git用来管理版本库的,不建议手动修改其中的内容。

git add 文件的名称(可以是多个,空格隔开) 将文件添加到版本库,鉴于版本控制系统只能跟踪文本文件的改动,所以二进制文件不适合使用版本控制系统。

git commit -m “第一次提交”将文件提交到仓库

git status查看当前工作区的文件状态

版本切换

git log --pretty=oneline
64d7550ce3ccaf00ffb99adf256896639da5d9cd (HEAD -> master) 这是第三个版本
28ddafb90c7bc90c5673abd9b5902a6ab5df2a35 这是第二个版本
8ccb6c429f33b5171a7027d16fe8f942231f9b33 这是一个测试

git log用于显示最近到最远的提交日志,如果嫌输出的信息太乱,可以加上–pretty=oneline参数。

我们看到的前面一大串字符(64d7550ce3ccaf00ffb99adf256896639da5d9cd)就是commit id(版本号)。在Git中,也可以用HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,如果版本太低我们可以用~,HEAD~100表示当前往上100个版本。

我们要恢复到上一个版本就可以使用命令

git reset --hard HEAD^

或者也可以直接使用版本号

git reset --hard 28ddaf

版本号没必要写全,只写前面几位(一般七位,也称为短版本号)即可,Git会自动去找正确的版本号。如果写太少的话,Git会无法确认正确的版本。

如果执行了git reset命令后悔了,我们可以使用git reflog查看每一条命令执行后的版本号,然后使用第二种恢复版本的方式撤销git reset

git diff HEAD -- readme

git diff HEAD查看工作区与仓库最新版本的区别。

git diff HEAD – readme查看工作区的文件readme与仓库最新版本的区别。

git checkout – readme把readme文件在工作区的修改全部撤销,这里有两种情况:。

git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区。

git rm readme从版本仓库把readme文件删除。

git checkout readme用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

远程仓库

添加远程仓库

git remote add origin https://gitee.com/chanyuantiandao/test.git

添加后,远程仓库的名字就是origin,也可以改成其他的,这只是一个代名词。

下一步,就可以把本地仓库的所有内容都推送到远程仓库上

git push -u origin master

由于远程仓库是空的,我们第一次推送master分支时,加上了参数-u,Git不但会把本地的master分支内容推送到远程的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地仓库作了修改,就可以通过命令:

git push origin master

把本地的master分支推送到远程服务器。

删除远程仓库

可以使用git remote rm <name>删除远程仓库。

git remote -v 可以查看远程仓库的名字。

git remote -v
origin  git@github.com:michaelliao/learn-git.git (fetch)
origin  git@github.com:michaelliao/learn-git.git (push)

git remote rm origin

其实,git remote rm <name>只是解除了本地与远程仓库的绑定关系,并没有在物理上删除远程仓库。

从远程仓库克隆

我们在使用中更多的情况是从远程仓库克隆代码,而不是本地创建然后关联远程仓库。可以用以下命令从远程克隆代码:

git clone git@gitee.com:chanyuantiandao/test.git

分支管理

分支创建与合并

我们创建一个master2<name>分支,然后切换到master2<name>分支:

git checkout -b master2

git checkout命令加上参数-b表示创建并切换,相当于以下两条命令:

git branch master2
git checkout master2

可以用git branch命令查看当前分支。

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

git merge master2表示把分支master2上面的内容合并到当前分支。

git merge –no-ff -m “merge with no-ff” master2表示把分支master2上面的内容合并到当前分支,参数–no-ff表示禁用Fast forward快速合并模式,这样合并的话会生成一个新的commit,所以要加上-m参数,把commit的描述写进去,这样的合并能看出来曾经做过哪些合并,而fast forward模式则不能。

git branch -d master2表示删除分支master2。

git branch -D master2表示强行删除分支master2。

新版本的Git提供了git switch来代替git checkout进行分支切换。

创建并切换到新的分支,可以使用:

git switch -c master2

切换到已经存在的分支,可以使用:

git switch master2

解决冲突

当不同的分支存在不同的修改内容时,执行git merge合并分支会发生冲突,可以使用git diff查看冲突内容:

git diff
diff --cc readme
index 90a7af7,90bec31..0000000
--- a/readme
+++ b/readme
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
 +Create a new branch master
++=======
+ Create a new branch master switch
++>>>>>>> master2

Git用 «««< ======= »»»> 标记出不同分支的内容。

修改内容解除冲突后,我们可以使用git log –graph查看分支的合并图。

git stash的使用

当我们急需修改其他分支而需要把当前未提交的内容封存起来的时候,我们可以使用git stash把当前的工作暂存起来,这时候git status查看工作区就显示没有修改内容。

当我们的修改工作完成以后需要继续我们封存起来的工作时,有两种办法:

一种是用git stash apply恢复之前的工作,但是stash内容并没有删除,需要执行git stash drop手动删除。

另一种方式是用git stash pop,该命令在恢复工作的同时把stash的内容也删除了。

在此期间,可以使用git stash list查看stash的内容。

如果存在多次stash,可以在恢复工作的时候恢复指定的stash,使用以下命令:

git stash apply stash@{0}

可以使用git cherry-pick <commit id>将其它分支的某次提交merge到当前分支,多用于一个分支修复bug后,同时merge到其它分支。

注意事项

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch –set-upstream branch-name origin/branch-name

标签管理

创建标签

git tag <name>可以在当前分支的最后一次commit处创建一个新标签。

git tag <name> <commit id>可以在当前分支的某一次commit(由commit id决定)处创建一个新标签。

git tag可以查看所有标签。

git show <tagname>可以查看标签信息。

git tag -a <name> -m “说明文字”可以创建带有说明的标签,用-a指定标签名,-m指定说明文字。

删除标签

如果标签打错了,也可以删除:

git tag -d <tagname>

创建的标签都只存储在本地,不会自动推送到远程。

  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin –tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

自定义Git

忽略特殊文件

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去(每行一个),Git就会自动忽略这些文件。如果希望指定的文件排除在外,可以在.gitignore中加一条!+文件名来将对应文件排除在.gitignore的规则外。

可以在add的时候添加参数-f强制添加被.gitignore文件忽略的内容到Git。

如果.gitignore比较复杂,需要找到哪条规则忽略了文件,可以使用git check-ignore -v test.txt命令检查。

配置别名

git config --global alias.st status

上述命令把status起了一个别名st,这样我们就可以直接使用git st了。

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

–global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用,如果不加的话只针对当前仓库起作用。

仓库的配置文件存放在.git/config中,当前用户的配置文件存放在~/.gitconfig中。

搭建Git服务器

  1. sudo apt-get install git安装git。
  2. sudo adduser git创建一个用户来运行git服务
  3. 创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
  4. sudo git init –bare sample.git初始化git仓库
  5. sudo chown -R git:git sample.git修改仓库的owner
  6. sudo chsh git -s $(which git-shell)禁用shell登录
  7. git clone git@server:/srv/sample.git克隆远程仓库

官方文档

官方中文手册:在线阅读 PDF下载
官方英文手册:在线阅读 PDF下载

打印/导出