git使用教程

本文主要记录了使用git的基本方法。操作系统:macOS-10.12.6

安装git

mac上安装git

1
brew install git    #安装git

配置git

让Git显示颜色,会让命令输出看起来更醒目:

1
git config --global color.ui true   #配置git,可以省略


创建版本库(仓库)

创建空目录

1
2
3
cd documents
mkdir git
cd git

初始化git仓库

1
git init

git的使用

添加/修改文件

在git中,如果不add到暂存区,那就不会加入到commit中。

1
2
git add 文件名1 ...    #把文件修改添加到暂存区
git commit -m "备注信息" #把暂存区的所有内容提交到当前分支

删除文件

1
2
git rm 文件名1 ...
git commit -m "备注信息"

查看仓库状态

1
git status

查看修改的内容(在add之前)

1
git diff 文件名

查看提交日志

1
git log --pretty=oneline --abbrev-commit

查看命令日志

1
git reflog

版本回退/前进

在Git中,用HEAD表示当前版本,也就是最新的提交版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
当然,直接写版本号前几位也是可以的!!!

1
git reset --hard HEAD^

版本撤销

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

1
git checkout -- 文件名

如果想把暂存区中的状态恢复成提交暂存区之前的状态,那么需要用git reset HEAD <file>来把暂存区的修改撤销掉(unstage),重新放回工作区,然后再用上面的命令撤销。


分支

开发一个新feature,或者修复一个bug,最好新建分支。

创建并切换分支

1
2
3
4
git checkout -b 分支名
该命令等价于:
git branch 分支名 #创建
git checkout 分支名 #切换

查看分支

1
git branch  #当前分支前面会标一个*号

合并分支

默认情况下,会使用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息

1
git merge 分支名

可以强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。(推荐)

1
git merge --no-ff -m "备注信息" 分支名

删除分支

1
2
git branch -d 分支名   #丢弃一个已经被合并过的分支
git branch -D 分支名 #丢弃一个没有被合并过的分支

冲突解决

在合并分支的时候,所在分支如果与其他分支有冲突,那么会对相应的文件进行报错,需要手动修改,修改完成后,即可重新对分支进行add与commit。使用以下命令可以看分支合并图。

1
git log --graph --pretty=oneline --abbrev-commit

bug分支

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

1
2
3
4
5
git stash       #储存
git stash list #查看stash列表
git stash apply #恢复现场,但恢复后不删除
git stash pop #恢复现场,同时把stash内容也删了
git stash apply stash@{0} #恢复指定的stash


远程库

不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

  1. master分支是主分支,因此要时刻与远程同步;
  2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  4. feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

查看远程库:

1
2
git remote -v   #查看远程库详细信息
git remote #查看远程库信息

添加远程库

1
git remote add origin git@github.com:jerryma0912/testgit.git    #远程库的名字就是origin,可以修改

删除远程库

1
git remote rm 远程库名

本地库的所有内容推送到远程库

把本地库的内容推送到远程,用git push命令,实际上是把当前分支推送到远程。

1
2
3
4
#第一次推送分支时,加上了-u参数,Git不但会把本地的分支内容推送的远程新的分支,还会把本地的分支和远程的master分支关联起来
git push -u <远程库名称,默认origin> 分支名

git push <远程库名称,默认origin> 分支名 #以后的推送

抓取分支

当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

1
git clone git@github.com:***

多人协作

clone后,默认情况下,只能看到本地的master分支。创建分支时:

1
2
git checkout -b dev origin/dev  #远程仓库有dev分支,那么如果要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是应创建本地dev分支,并且和远程origin/dev分支关联
git checkout -b dev #远程仓库只有master分支

提交时,也使用git push <远程库名称,默认origin> 分支名进行提交。
如果提交有冲突,那么先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
如果没有指定本地dev分支与远程origin/dev分支的链接,那么需要先设置dev和origin/dev的链接:git branch --set-upstream-to=origin/dev dev


标签

git创建标签

1
2
3
4
git tag <name>  #对最新commit打标签
git tag <name> <commit id> #对指定的commit打标签
git tag -a <name> -m "备注信息" <commit id> #创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -s <name> -m "备注信息" <commit id> #用私钥签名一个标签

查看标签

1
git tag

查看标签信息

1
git show <tagname>

标签推送到远程

1
2
git push origin <name>  #推送一个标签
git push origin --tags #推送所有的标签

删除标签

1
2
git tag -d <name>   #本地删除标签
git push origin :refs/tags/<name> #删除远程标签

自定义git

忽略特殊文件

有些时候必须把某些文件放到Git工作目录中,但又不能提交它们。因此,可以在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
.gitignore文件不需要从头写,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

最后,将.gitignore也提交到Git即可。

以后,如果确实想添加该文件,可以用-f强制添加到Git:

1
git add -f <filename>

或者,如果发现文件写不进去的原因可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

1
git check-ignore -v App.class

配置别名

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

1
2
3
4
5
6
7
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit #git ci -m "bala bala bala..."
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD' #git unstage test.py == git reset HEAD test.py
git config --global alias.last 'log -1' #git last就能显示最近一次的提交
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" #git lg 显示commit图

配置文件放在每个仓库的.git/config文件中,如果要删除别名,直接把对应的行删掉即可。
当前用户的Git配置文件放在用户主目录(~)下的一个隐藏文件.gitconfig中。配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。


搭建git服务器(linux环境下)

(1)首先,安装git:

1
sudo apt-get install git

(2)创建一个git用户,用来运行git服务:

1
sudo adduser git

(3)创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

(4)初始化Git仓库:
选定一个目录作为git仓库,假定是sample.git,在该目录的父目录下,执行以下命令:

1
sudo git init --bare sample.git

Git会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

1
sudo chown -R git:git sample.git

(5)禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件:

1
2
3
git:x:1001:1001:,,,:/home/git:/bin/bash
改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
(6)克隆远程仓库:

1
git clone git@server:sample.git

剩下的推送就简单了。

更新fork后的仓库

(1)首先保证本地仓库的upstream是源项目的URL,若没有则添加:

1
git remote add upstream URL

(2)然后利用fetch和merge合并upstream的master分支:

1
2
git fetch upstream
git merge upstream/master

(3)此时本地的master分支就更新至upstream的master版本。然后利用push将本地分支覆盖到git远程分支上:

1
git push



此外,如果要方便管理公钥,用Gitosis;
要像SVN那样变态地控制权限,用Gitolite

本文标题:git使用教程

文章作者:Jerry

发布时间:2018年03月23日 - 21:30:03

最后更新:2019年07月02日 - 21:24:18

原始链接:https://jerryma0912.github.io/2018/03/23/14-Git/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。