git基本用法总结

花了一上午的时间把廖雪峰老师的git教程浏览了一遍,也算是查缺补漏吧。教程中讲到的基本用法对日常工作已足够使用。

git基本用法总结

git

安装完git后,在git bash中设置:
git config --global user.name 'icecry'
git config --global user.email 'xx@xx.com'
//git config --global color.ui true

-----创建版本库
mkdir code
cd code
pwd

//window确保目录无中文

git init //将该code目录变成git可以管理的仓库

此时会生成.git目录,不要修改该目录,默认隐藏,可以使用ls -ah命令查看

添加代码文件后
git add code.php //将代码添加到仓库

git commit -m "this is a comment" //把文件提交到仓库
//git add file2 file3 ... commit 一次可以提交多个文件

继续修改文件后,使用git status查看结果,时刻掌握仓库当前状态

使用git diff来查看具体文件有怎样的修改

提交修改和提交新文件同样步骤,git add -> git commit

------版本回退

使用git log来查看历史记录,commit id 是通过SHA1计算出来的数字,用十六进制表示
git log 命令显示从最近到最远的提交日志,添加 --pretty=oneline 可以一行显示

git中
HEAD 当前版本
HEAD^ 上个版本
HEAD^^ 上上个版本
HEAD~100 往上100个版本

回退当上个版本:git reset --hard HEAD^

git log 已经查看不到被回退的版本信息,但只要未关闭窗口,查看被回退的commit id,指定版本后就能回到被回退的版本

git reset --hard 32f67e 只需指定前面几个字符即可
//--hard就是用版本库的内容覆盖本地

git版本回退速度非常快,git内部有个指向当前版本的head指针

//如果关闭了窗口,怎么查看commit id?
git提供了 git reflog命令来记录你的每一次命令
git reflog
此时就能查看当commit id了

-------工作区和暂存区

code目录就是工作区
code目录中的.git就是git的版本库,git版本库中最重要的成为stage或是index的暂存区,还有git为我们自动创建的第一个分支master,以及master的一个指针叫HEAD

git add 实际上就是把文件修改添加到暂存区
git commit 实际上就是把暂存区的所有内容提交到当前分支

-------------管理修改 git管理的是修改,而非文件

如果修改readme.txt然后add后,再次修改readme.txt,如果不再次add,直接commit则第二次修改不会被提交,只会提交在暂存区的代码,使用git status可以查看

----------撤销修改

再次修改后发现出错,可以手动修改,也可以使用git checkout -- file 来丢弃工作区的修改
工作区的状态有两种可能:
一是readme.txt自修改后还没放到暂存区,现在撤销修改就回到和版本库一模一样的状态
一是readme.txt已经添加到暂存区,又做了修改,则撤销修改后就回到添加暂存区后的状态

//git checkout -- file 中 -- 非常重要,如果没有 -- 则编程了切换到另一个分支的命令

如果将打算修改的内容已经提提交到了暂存区该怎么恢复?
此时可以使用git reset HEAD file可以把暂存区的修改撤销掉,重新放回工作区,然后使用git checkout -- file清除工作区修改即可

如果提交到了版本库,只能使用回退上一版本命令
不过,如果将本地版本库推送到了远程,那就真的惨了

----------git删除文件
git rm file
删除工作区文件后,提交到版本库即可

如果误删,就可以使用 git checkout -- file 来恢复到最新版本

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

------------------远程仓库
github

本地git仓库和github仓库之间的传输是通过ssh加密的,所遇需要设置:
ssh-keygen -t rsa -C 'yzhsh89@126.com'

然后在主目录找到.ssh目录,里面有id_rsa 和 id_rsa.pub两个文件,这两个就是使用ssh key的密钥对,id_rsa是私钥,不能泄漏,id_rsa.pub是公钥,可以放心告诉任何人。

//输入过程,默认为c盘,而项目目录在/d/code下,此时需要直接输入 .ssh/id_rsa 即可在当前目录下

登录github 在account setting中,ssh key中粘贴id_rsa.pub中的内容

!!!在使用git push时无法检测id_rsa,必须在/c/use/administrator/.ssh下

-----------------添加远程仓库
github
create a new repo

创建完的仓库为空,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库。

本地仓库运行
git remote add origin git@github.com:IceCry/learn.git

添加后,远程库的名字就是origin,这是git默认的叫法,也可以修改成别的,但是origin一看就知道是远程库

下一步可以将本地内容推送到远程库中
git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上就是把当前分支master推送到远程

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

从现在起,只要本地做了提交,就可以通过命令:git push origin master把本地master分支的最新修改推送到github

ssh警告
当第一次使用clone或是push连接github时,会得到一个警告。因为git使用ssh连接在第一次验证github服务器的key时,需要确认github的key的指纹信息是否真的来自github服务器,输入yes添加到信任列表即可

------------------clone库
git clone git@github.com:IceCry/learn.git

git支持多种协议,默认使用git://使用ssh,但也可以使用https等其他协议

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

-----------------------分支管理

创建dev分支,然后切换到dev
git checkout -b dev //添加-b参数表示创建并切换相当于 git branch dev git checkout dev

使用git branch可以查看当前分支

在dev分支下修改readme.txt,切换回master git checkout master 查看,未发现改动,因为该提交在dev上,master分支未改动

将dev分支工作合并到master上:
git merge dev

合成完成后,可以删除dev分支
git branch -d dev

-----------------------解决冲突

dev修改提交
master修改提交
merge合并时产生冲突,修改冲突文件后重新提交

使用git log查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit

-----------------分支管理策略
合并分支时,如果可能,git会用fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用fast forward模式,git就会在merge时生成一个新的commit,这样从分支历史上就能看出分支信息。

--no-ff

git merge --no-ff -m 'merger withe no-ff' dev

分支策略
实际开发中,master非常稳定,仅用来发布新版本,平时不能在上面干活

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

--------------------------bug分支

当有bug时,需要创建一个分支issue-101来修复它,但当前正在dev上的工作尚未完成还没有提交。
git提供一个stash功能,把当前工作现场储藏起来,等以后恢复现场后继续工作

git stash

此时用git status查看工作区是干净的
创建bug分支修复合并后删除bug分支

使用 git stash list 查看被存储的列表

恢复方法
git stash apply -> git stash drop
或是:git stash pop 恢复的同时把stash内容也删除了,再用 git stash list查看就找不到任何stash内容了

多次stash后,恢复时可以用 stash list查看,然后恢复指定的stash
git stash apply stash@{0}

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

-------------------feature分支

添加新功能
git checkout -b feature-value

完成后切回dev,进行合并。

此时功能取消,删除feature-value分支
git branch -d feature-value
删除失败,提示分支未合并,如果删除将丢失修改,需要强行删除 git branch -D feature-value

如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

------------------多人协作

git remote 查看远程库信息
git remove -v 显示更详细信息(显示了可以抓取和推送的origin的地址,如果没有推送权限,就看不到push地址)

推送分支,就是把该分支撒谎能够的所有本地提交推送到远程库,推送时要指定本地分支

git push origin master
git push origin dev

-----------------抓取分支
其他人克隆项目到自己电脑修改
git clone git@github.com:IceCry/learn.git
此时从远程库克隆的代码,只能看到master分支,git branch查看

然后其需要在dev分支开发,就必须创建远程origin的dev分支到本地,使用:
git checkout -b dev origin/dev

即可进行修改提交
git push origin dev

此时你同时修改了文件,试图推送:
git push origin dev

推送失败,有冲突。
解决:
先用git pull把最新的提交从origin/dev抓下来,本地合并解决冲突后再推送

git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接

git branch --set-upstream dev origin/dev

再pull
修改冲突后,提交

------------------------标签管理

发布一个版本时,我们通常在版本库中打一个tag,commit id并不便于记忆

创建标签,在需要打标签的分支上,使用 git tab 即可
git tag v1.0

git tag查看所有标签

默认标签是打在最新提交的commit上的,有时忘记打标,需要查看历史记录再处理

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

根据查到的commit id打标签
git tag v1.1 622ds4

//标签不是按时间顺序列出,而是按字母排序的,可以用
git show tagname查看标签信息

创建带有说明的标签,-a指定标签名,-m指定说明文字
git tag -a v0.1 -m 'version 0.1 released' 3245sd

还可以通过 -s用私钥签名一个标签
git tag -s v0.2 -m 'signed version 0.2 released' fss2d
前面采用PGP签名,因此必须首先安装pgp,否则报错

如果标签打错了,可以删除
git tag -d v0.1

推送:git push origin tagname
一次性推送全部标签:git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
git tag -d v0.2

然后从远程删除
git push origin :refs/tags/v0.2

-------------------使用github

查看别人项目 fork就clone一份到自己帐号 修改提交 修改原项目bug,在github上发起一个pull request 等待对方接受

---------------------忽略文件
在git工作区根目录下创建.gitignore文件,然后把要忽略的文件填写进去,git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则:

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

最后把.gitignore提交到git就可以了,通过git status来校验

强制添加被忽略的文件到git,需要添加-f
git add -f hi.py

或者可能是.gitignore写的有问题,需要找到哪个规则写错了,看可以用 git check-ignore命令检查

git check-ignore -v hi.py

--------------配置别名

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 -l' //显示最后一次提交

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/config文件中

----------------------搭建git服务器
1 安装git
sudo apt-get install git

2 创建git用户来运行git服务
sudo adduser git

3 创建证书登录
收集所有需要登录的公钥,id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个

4 初始化git仓库
先选定一个i额目录作为git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git

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

把owner改为git
sudo chown -R git:git sample.git

5 禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/bin/bash

改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

6 克隆远程仓库
git clone git@server:/srv/sample.git

如果团队有几百号人,不便将公钥收集写入文件,可以用Gitosis来管理公钥。

Gitolite可以用来编写控制脚本从而达到管理权限的目的(git不支持权限管理)


Git的官方网站:http://git-scm.com

git-cheatsheet.pdf

Tags: git

添加新评论