git-即时笔记

来源:互联网 发布:软件历史版本下载 编辑:程序博客网 时间:2024/05/22 14:01

1,在Windows上安装Git
msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"


2,创建版本库
$ mkdir learngit
$ cd learngit
$ pwd
$ git init




3,把文件添加到版本库
$ git add readme.txt
$ git commit -m "wrote a readme file"
$ git add file1.txt
$ git add file2.txt
$ git add file3.txt
$ git commit -m "add 3 files."
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
第一步,使用命令git add ,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成。


4,时光机穿梭
$ git status
$ git diff readme.txt 
$ git add readme.txt
$ git status
$ git commit -m "add distributed"
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。


5,版本回退
$ git log
$ git log --pretty=oneline
$ git reset --hard HEAD^
cat 一般是用来查看文本文件内容
$ cat readme.txt
$ git log
$ git reset --hard 3628164
$ cat readme.txt
$ git reflog
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。


6,工作区(Working Directory)和暂存区stage(或者叫index)
先对readme.txt做个修改
然后,在工作区新增一个LICENSE文本文件
$ git status
使用两次命令git add,把readme.txt和LICENSE都添加
$ git status
$ git commit -m "understand how stage works"
$ git status


7,管理修改
对readme.txt做一个修改
$ cat readme.txt
$ git add readme.txt
$ git status
再修改readme.txt
$ cat readme.txt 
$ git commit -m "git tracks changes"
$ git status
$ git diff HEAD -- readme.txt 
每次修改,如果不add到暂存区,那就不会加入到commit中。


8,撤销修改
$ cat readme.txt
$ git status
git checkout -- file可以丢弃工作区的修改
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修
改全部撤销
$ git checkout -- readme.txt
$ cat readme.txt
$ cat readme.txt
$ git add readme.txt
$ git status
用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
$ git reset HEAD readme.txt
$ git checkout -- readme.txt
$ git status
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃
修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回
退一节,不过前提是没有推送到远程


9,删除文件
$ git add test.txt
$ git commit -m "add test.txt"
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删


了:
$ rm test.txt
$ git status
确实要从版本库中删除该文件,那就用命令git rm删掉,并且commit
$ git rm test.txt
$ git commit -m "remove test.txt"
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件
恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改
还是删除,都可以“一键还原”


10,远程仓库
$ ssh-keygen -t rsa -C "youremail@example.com"


11,添加远程库
我们根据GitHub的提示,在本地的learngit仓库下运行命令
$ git remote add origin git@github.com:michaelliao/learngit.git
把本地库的所有内容推送到远程库上
$ git push -u origin master
$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式
版本库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;


12,从远程库克隆
远程库(gitskills)已经准备好了,下一步是用命令git clone克隆一个本地库:
$ git clone git@github.com:michaelliao/gitskills.git
$ cd gitskills
$ ls
GitHub给出的地址不止一个,还可以用
https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快


13,分支管理


14,创建与合并分支
$ git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令
$ git branch dev
$ git checkout dev
用git branch命令查看当前分支
$ git branch
对readme.txt做个修改
$ git add readme.txt 
$ git commit -m "branch test"
dev分支的工作完成,我们就可以切换回master分支
$ git checkout master
$ git merge dev
$ git branch -d dev
$ git branch
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name


15,解决冲突
$ git checkout -b feature1
修改readme.txt
$ git add readme.txt 
$ git commit -m "AND simple"
切换到master分支:
$ git checkout master
在master分支上把readme.txt文件的最后一行改
$ git add readme.txt 
$ git commit -m "& simple"
$ git merge feature1
$ git status
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存
$ git add readme.txt 
$ git commit -m "conflict fixed"
$ git log --graph --pretty=oneline --abbrev-commit
$ git branch -d feature1
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图


16,分支管理策略
合并分支时,如果可能,Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用“Fast forward”模式,Git就会在merge时生成一个新的
commit,这样,从分支历史上就可以看出分支信息。
$ git checkout -b dev
修改readme.txt文件,并提交一个新的commit
$ git add readme.txt 
$ git commit -m "add merge"
现在,我们切换回master
$ git checkout master
准备合并dev分支,请注意--no-ff参数,表示禁用“Fast forward”
$ git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
$ git log --graph --pretty=oneline --abbrev-commit
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,
能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。




17,Bug分支
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支
issue -101来修复它,但是,等等,当前正在dev上进行的工作还没有提交
$ git status
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash
$ git checkout master
现在修复bug,需要把“Git is free software ...”改为“Git is a free software ...”
$ 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
接着回到dev分支干活
$ git checkout dev
$ git stash list
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
$ git stash pop
$ git stash list
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的
stash
$ git stash apply stash@{0}
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复
后,再git stash pop,回到工作现场




18,Feature分支
开发代号为Vulcan的新功能
$ git checkout -b feature-vulcan
$ git status
切回dev,准备合并
$ git checkout dev
$ git branch -d feature-vulcan
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢
失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan
$ git branch -D feature-vulcan
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D name强行删除




19,多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分
支对应起来了,并且,远程仓库的默认名称是origin
要查看远程库的信息,用git remote
$ git remote
用git remote -v显示更详细的信息
$ git remote -v


推送分支


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


抓取分支


模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或
者同一台电脑的另一个目录下克隆
$ git clone git@github.com:michaelliao/learngit.git
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的


master分支

$ git branch
你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于
是他用这个命令创建本地dev分支
$ git checkout -b dev origin/dev
他就可以在dev上继续修改,然后,时不时地把dev分支push到远程
$ git commit -m "add /usr/bin/env"
$ git push origin dev
你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件
作了修改,并试图推送
$ git add hello.py 
$ git commit -m "add coding: utf-8"
$ git push origin dev


解决冲突
$ git pull
git pull也失败,没有指定本地dev分支与远程origin/dev分支的链接,根据提
示,设置dev和origin/dev的链接
$ git branch --set-upstream dev origin/dev
$ git pull
git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的
解决冲突完全一样。解决后,提交,再push
$ git commit -m "merge & fix hello.py"
$ git push origin dev
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
如果git pull提示“no tracking information”,则说明本地分支和远程分支
的链接关系没有创建,用命令git branch --set-upstream branch-name 
origin/branch-name。




20,标签管理
21,创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上
$ git branch
$ git checkout master
敲命令git tag name就可以打一个新标签
$ git tag v1.0
$ git tag
默认标签是打在最新提交的commit上的,方法是找到历史提交的commit id,然后打上
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 6224937
$ git tag
$ git show v0.9
创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 3628164
用命令git show tagname可以看到说明文字
$ git show v0.1
可以通过-s用私钥签名一个标签
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或
者没有gpg密钥对,就会报错
用命令git show tagname可以看到PGP签名信息
$ git show v0.2
命令git tag name用于新建一个标签,默认为HEAD,也可以指定一个commit id
-a tagname -m "blablabla..."可以指定标签信息;
-s tagname -m "blablabla..."可以用PGP签名标签;
命令git tag可以查看所有标签;




22,操作标签
如果标签打错了,也可以删除:
$ git tag -d v0.1
如果要推送某个标签到远程,使用命令git push origin tagname:
$ git push origin v1.0
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
$ git tag -d v0.9
然后,从远程删除。删除命令也是push
$ git push origin :refs/tags/v0.9
命令git push origin tagname可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d tagname可以删除一个本地标签;
命令git push origin :refs/tags/tagname可以删除一个远程标签。




23,使用github
https://github.com/twbs/bootstrap
git clone git@github.com:michaelliao/bootstrap.git
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。


24,自定义安装git
让Git显示颜色,会让命令输出看起来更醒目
$ git config --global color.ui true
这样,Git会适当地显示不同的颜色,比如git status命令


25,忽略特殊文件
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需
要组合一下就可以使用了。所有配置文件可以直接在线浏览:
https://github.com/github/gitignore
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个
文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
1.忽略某些文件时,需要编写.gitignore。
2.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!




26,配置别名
我们只需要敲一行命令,告诉Git,以后st就表示status
$ 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 ci -m "bala bala bala..."
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用
命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回
工作区。既然是一个unstage操作,就可以配置一个unstage别名
$ git config --global alias.unstage 'reset HEAD'
$ git unstage test.py
$ git reset HEAD test.py
配置一个git last,让其显示最后一次提交信息
$ git config --global alias.last 'log -1'
用git last就能显示最近一次的提交
$ git last
给Git配置好别名,就可以输入命令时偷个懒


27,搭建git服务器
第一步,安装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:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出
第六步,克隆远程仓库:
可以通过git clone命令克隆远程仓库了,在各自的电脑上运行
$ git clone git@server:/srv/sample.git管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人
,就没法这么玩了,这时,可以用Gitosis来管理公钥。这里我们不介绍怎么玩
Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里
设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务
器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是
这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中
小结:
搭建Git服务器非常简单,通常10分钟即可完成;
要方便管理公钥,用Gitosis;
要像SVN那样变态地控制权限,用Gitolite。
























0 0
原创粉丝点击