Git 教程
引言
一直在硬盘里面吃灰,今天无意间看到了。备忘。全文均是整理自廖雪峰老师教程。
一、安装git
Linux安装:
$ sudo apt-get install git
$ git config --global user.name "Your Name" #配置
$ git config --global user.email "email@example.com"
Windows安装:
https://git-scm.com/downloads
终端->git-bash.exe
二、创建版本库
选择合适路径,创建目录作为本地仓库:
$ pwd #pwd命令⽤于显⽰当前目录
$ git init #把把当前录变成Git可以管理的仓库
#Windows下建议下载Notepad++代替记事本把Notepad++的默认编码设置为UTF-8 without BOM即可。
$ git add readme.txt #告诉Git,把⽂件添加到仓库
$ git commit -m "wrote a readme file" #告诉Git,把⽂件提交到仓库
三、时光穿梭
$ git status #查看仓库当前的状态
$ git diff readme.txt #查看difference
四、版本回退
$ git log #显⽰从最近到最远的提交⽇志
$ git log --pretty=oneline #简洁版
版本回退指令:
$ git reset --hard HEAD^ #上个版本
$ git reset --hard HEAD^^ #上两个版本
$ git reset --hard HEAD~100 #上100个版本
$ git reset --hard 3628164 #根据git log出的commit id号精准回退
$ cat readme.txt #查看内容
$ git reflog #记录每⼀次命令(意会:重返未来)
五、撤销修改
$ git checkout -- readme.txt #(工作区)回到最近⼀次git commit或git add时的状态,命令中的“--”很重要,没有“--”,就变成了“创建⼀个新分⽀”的命令
六、删除文件
$ rm test.txt #一般情况,和Linux命令一样
$ git rm test.txt #从版本库中删除该⽂件,⽤git rm且commit
$ git commit -m "remove test.txt"
七、远程仓库
1、网页申请账号登录
2、本地创建SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
#在用户主目录下Ctrl+h显示隐藏文件夹.ssh/id_rsa.pub->copy
#登录网页账户Account setting->SSHkeys->AddSSHKey->paste
3、关联本地仓库和远程仓库
create a new repo后:
$ git remote add origin git@github.com:boonvon/learngit.git #remote(远程)将本地仓库和远程仓库关联起来<第一次关联即可,以后不用>
$ git push -u origin master #把本地库的所有内容推送到远程库上<第一次>
之后直接$ git push origin master
4、从远程仓库克隆
$ git clone git@github.com:boonvon/learngit.git #也可以直接使用http格式
$ git clone https://github.com/boovon/learngit.git
八、分支管理<多人合作时>
$ git checkout -b dev #(build)创建dev分⽀,然后切换到dev分⽀
等价于以下两句:
$ git branch dev #创建dev分支
$ git checkout dev #切换到Dev分支
$ git branch #查看当前分⽀
$ git checkout master #切回master
$ git merge dev #(merge并入、合并)合并当前分支至master“快进模式”
$ git branch -d dev #(delete)删除dev分⽀
九、解决冲突
$ git checkout -b feature1
$ git add readme.txt
$ git commit -m "AND simple"
$ git checkout master
$ git add readme.txt
$ git commit -m "& simple"
$ git merge feature1
$ git status
master和branch同时有新的提交在合并时导致冲突,这种情况下,Git⽆法执⾏“快速合并”必须⼿动解决冲突后再提交,修改后在提交。
$ git add readme.txt
$ git commit -m "conflict fixed"
$ git log --graph --pretty=oneline --abbrev-commit #查看分⽀的合并情况
$ git branch -d feature1
十、分支管理策略
通常,合并分⽀时,如果可能,Git会⽤“Fast forward”模式,但这种模式下,删除分⽀后,会丢掉分⽀信息,可强制禁⽤“Fast forward”模式,Git就会在merge时⽣成⼀个新的commit,这样,从分⽀历史上就可以看出分⽀信息。
$ git checkout -b dev
$ git add readme.txt
$ git commit -m "add merge"
$ git checkout master
$ git merge --no-ff -m "merge with no-ff" dev #fast forward
$ git log --graph --pretty=oneline --abbrev-commit
十一、bug分支—(类似于中断)
当前分支工作还未完成,以前的版本出现bug,需要立马处理但又不想提交现在的分支,Git还提供⼀个stash功能,可以把当前⼯作现场“暂藏”起来,等以后恢复现场后继续⼯作。
$ git status
$ git stash #“暂藏”当前分支
$ git checkout master
$ git checkout -b issue-101
$ git add readme.txt
$ git commit -m "fix bug 101"
切换到master分⽀,并完成合并,最后删除issue-101分⽀
$ git checkout master
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
$ git stash list #查看“暂藏”列表
$ git stash pop #恢复的同时把stash内容也删了
十二、多人协作
$ git remote #查看远程库的信息
$ git remote -v #显⽰更详细的信息
推送分⽀,把该分⽀上的所有本地提交推送到远程库。推送时,要指定本地分⽀,这样,Git就会把该分⽀推送到远程库对应的远程分⽀上:
$ git push origin master
$ git push origin dev
抓取分支,多⼈协作时,⼤家都会往master和dev分⽀上推送各⾃的修改。对同样的⽂件作了修改,并试图推送,推送失败,因为⼩伙伴的最新提交和你试图推送的提交有冲突,此时,Git已经提⽰我们,先⽤git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
$ git pull #抓取分支
git pull失败,原因是没有指定本地dev分⽀与远程origin/dev分⽀的链接,根据提⽰,设置dev和origin/dev的链接:
$ git branch --set-upstream dev origin/dev
再pull:
$ git pull
git pull成功,但是合并有冲突,需要⼿动解决,解决的⽅法和分⽀管理中的解决冲突完全⼀样。解决后,提交,再push:
$ git commit -m "merge & fix hello.py"
$ git push origin dev
如果git pull提⽰“no tracking information”,则说明本地分⽀和远程分⽀的链接关系没有创建,⽤命令:
$git branch --set-upstream branch-name origin/branch-name。
十三、标签管理
$ git branch
$ git checkout master
$ git tag v1.0 #打标签
$ git tag #查看所有标签
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签可以找到历史提交的commit id,然后打上:
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 6224937 #打标签
$ git tag -a v0.1 -m "version 0.1 released" 3628164
#创建带有说明的标签,⽤-a指定标签名,-m指定说明⽂字
$ git show v0.9 #查看标签信息
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
#通过-s⽤私钥签名⼀个标签,签名采⽤PGP签名,因此,必须⾸先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。
十四、操作标签
如果标签打错了,也可以删除:
$ git tag -d v0.1 #删除标签
$ git push origin v1.0 #推送某个标签到远程
$ git push origin --tags #⼀次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就⿇烦⼀点,先从本地删除
$ git tag -d v0.9
然后,从远程删除。删除命令也是push,格式如下
$ git push origin :refs/tags/v0.9
十五、⾃定义Git
Git还有很多可配置项。⽐如,让Git显⽰颜⾊,会让命令输出看起来更醒目:
$ git config --global color.ui true
配置别名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
#把暂存区的修改撤销掉
$ git config --global alias.last 'log -1'
#显⽰最后⼀次提交信息
甚⾄还有⼈丧⼼病狂地把lg配置成了:
$ 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"
十六、搭建服务器
7x24⼩时开机并交换⼤家的修改,准备⼀台运⾏Linux的机器,强烈推荐⽤Ubuntu或Debian,sudo权限。
第⼀步,安装git:
$ sudo apt-get install git
第⼆步,创建⼀个git⽤户,⽤来运⾏git服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的⽤户的公钥,就是他们⾃⼰的id_rsa.pub⽂件,把所有公钥导⼊到/home/git/.ssh/authorized_keys⽂件⾥,⼀⾏⼀个。
第四步,初始化Git仓库:
先选定⼀个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输⼊命令:
$ sudo git init --bare sample.git
Git就会创建⼀个裸仓库,裸仓库没有⼯作区,因为服务器上的Git仓库纯粹是为了共享,所以不让⽤户直接登录到服务器上去改⼯作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git
第五步,禁⽤shell登录:
出于安全考虑,第⼆步创建的git⽤户不允许登录shell,这可以通过编辑/etc/passwd⽂件
完成。找到类似下⾯的⼀⾏:
git❌1001:1001:,:/home/git:/bin/bash
改为:
git❌1001:1001:,:/home/git:/usr/bin/git-shell
这样,git⽤户可以正常通过ssh使⽤git,但⽆法登录shell,因为我们为git⽤户指定的gitshell每次⼀登录就⾃动退出。
第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各⾃的电脑上运⾏:
$ git clone git@server:/srv/sample.git
管理公钥:小团队把每个⼈的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys⽂件⾥就是可⾏的。
管理权限:Gitolite⼯具。