本文主要记录了使用git的基本方法。操作系统:macOS-10.12.6
安装git
mac上安装git
1 | brew install git #安装git |
配置git
让Git显示颜色,会让命令输出看起来更醒目:1
git config --global color.ui true #配置git,可以省略
创建版本库(仓库)
创建空目录
1 | cd documents |
初始化git仓库
1 | git init |
git的使用
添加/修改文件
在git中,如果不add
到暂存区,那就不会加入到commit
中。1
2git add 文件名1 ... #把文件修改添加到暂存区
git commit -m "备注信息" #把暂存区的所有内容提交到当前分支
删除文件
1 | git rm 文件名1 ... |
查看仓库状态
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 | git checkout -b 分支名 |
查看分支
1 | git branch #当前分支前面会标一个*号 |
合并分支
默认情况下,会使用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息1
git merge 分支名
可以强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。(推荐)1
git merge --no-ff -m "备注信息" 分支名
删除分支
1 | git branch -d 分支名 #丢弃一个已经被合并过的分支 |
冲突解决
在合并分支的时候,所在分支如果与其他分支有冲突,那么会对相应的文件进行报错,需要手动修改,修改完成后,即可重新对分支进行add与commit。使用以下命令可以看分支合并图。1
git log --graph --pretty=oneline --abbrev-commit
bug分支
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:1
2
3
4
5git stash #储存
git stash list #查看stash列表
git stash apply #恢复现场,但恢复后不删除
git stash pop #恢复现场,同时把stash内容也删了
git stash apply stash@{0} #恢复指定的stash
远程库
不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
查看远程库:
1 | git remote -v #查看远程库详细信息 |
添加远程库
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分支对应起来了,并且,远程仓库的默认名称是origin1
git clone git@github.com:***
多人协作
clone后,默认情况下,只能看到本地的master分支。创建分支时:1
2git 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 | git tag <name> #对最新commit打标签 |
查看标签
1 | git tag |
查看标签信息
1 | git show <tagname> |
标签推送到远程
1 | git push origin <name> #推送一个标签 |
删除标签
1 | git tag -d <name> #本地删除标签 |
自定义git
忽略特殊文件
有些时候必须把某些文件放到Git工作目录中,但又不能提交它们。因此,可以在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
.gitignore文件不需要从头写,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
最后,将.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
7git 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
3git: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
2git fetch upstream
git merge upstream/master
(3)此时本地的master分支就更新至upstream的master版本。然后利用push将本地分支覆盖到git远程分支上:1
git push