Git应用套路
Git应用套路
一. 配置git别名
1.通过控制台命令vim ~/.gitconfig
打开配置页面
2.配置如下内容:
[user]
name = your Name
email = your E-mail
[alias]
co=checkout
ci=commit
st=status
pl=pull
ps=push
dt=difftool
ca=commit -am
b=branch
t=tag
[push]
default = simple
二. git在本地项目中的应用
1.项目git初始化
git init
2.查看本地项目的状态--git st
3.将项目放在本地的暂存区--git add .
/git add 要添加的文件名
4.将项目添加到本地git仓库--git ca -m "文本说明"
/git ca "文本说明"
三. git连接远程仓库,并进行推送
1.利用如下语句连接远程仓库,添加远程的数据源
git remote add origin git@gitee.com:your-name/your-project.git //如果此时正常会正常链接
//如果提示链接已存在,可以利用下面的命令进行删除
git remote rm origin
2.将本地的数据推送到远程仓库
git ps -u origin master //注意如果是首次进行远程推送,要注意加上参数-u
3.此时线上可能会报错,提示冲突或者是不能够进行正确的推送;我们当前的做法是将远程的数据拉下来。
git pull //利用git pull将远程的数据拉下来
4.此时还会提示错误,错误如下所示:
$ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From github.com:michaelliao/learngit fc38031..291bea8 dev -> origin/dev There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream dev origin/<branch>

5.出现此错误的原因是没有指定本地dev分支与远程origin/dev分支的链接,所以,我们要用如下语句进行本地分支与远程分支的链接。
git branch --set-upstream master origin/master
6.建立连接后,再进行资源的下拉,将远程的资源拉到本地
git pull //将远程的资源拉到本地
7.利用
git st
命令查看是否有冲突,如果有冲突手动的解决冲突
8.如果没有冲突,将本地的项目推到远程的git仓库
git ps -u origin master
四. git分支的创建与合并
1.创建git分支
git checkout -b branch-name //创建分支的命令
2.查看本地分支
git branch
3.查看远程分支
git branch -r
4.合并分支
git merge branch-name //git merge命令用于合并指定分支到当前分支
5.删除分支
git branch -d branch-name //branch-name代表要删除分支的名字
五. git文件的修改删除控制
1.查看工作区和版本库里最新版本的区别
git diff HEAD -- readme.txt
2.如果文件只是在工作区修改了,没有进行git ca
或者是git add .
或者是git add file-name
,那么可以用如下的命令进行文件的恢复。
git checkout -- file-name //可以丢弃工作区指定文件的修改
//命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
//一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
//一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
//总之,就是让这个文件回到最近一次git commit或git add时的状态。
3.如果文件放在了暂存区,没有进行git ca -m
或者是git ca
操作,那么可以用如下的命令进行文件的恢复。
用命令
git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
4.查看版本历史记录的命令git log
,git log命令显示从最近到最远的提交日志。
1.如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数。需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。
2.Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
3.现在,我们要把当前版本回退到上一个版本,就可以使用git reset命令:
git reset HEAD^
4.回退到指定的版本,如果最新的那个版本已经看不到了,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个对应版本的commit id,比如是3628164...,于是就可以指定回到未来的某个版本:
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
5.如果窗口已经关闭了,可以通过
git reflog
这个指令来查看日志,这个指令可以查看你的每一次命令。
六. 标签的创建和管理
1.查看标签git tag
2.创建标签git tag tag-name
3.默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?方法是找到历史提交的commit id,然后打上就可以了:
$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
...
//比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:
$ git tag v0.9 6224937
4.注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show 查看标签信息:
$ git show v0.9
commit 622493706ab447b6bb37e4e2a2f276a20fed2ab4
Author: Michael Liao <askxuefeng@gmail.com>
Date: Thu Aug 22 11:22:08 2013 +0800
add merge
...
5.还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
//用命令git show <tagname>可以看到说明文字:
$ git show v0.1
tag v0.1
Tagger: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 26 07:28:11 2013 +0800
version 0.1 released
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
//还可以通过-s用私钥签名一个标签:
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
//签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
//如果报错,请参考GnuPG帮助文档配置Key。
//用命令git show <tagname>可以看到PGP签名信息:
$ git show v0.2
tag v0.2
Tagger: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 26 07:28:33 2013 +0800
signed version 0.2 released
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (Darwin)
iQEcBAABAgAGBQJSGpMhAAoJEPUxHyDAhBpT4QQIAKeHfR3bo...
-----END PGP SIGNATURE-----
commit fec145accd63cdc9ed95a2f557ea0658a2a6537f
Author: Michael Liao <askxuefeng@gmail.com>
Date: Thu Aug 22 10:37:30 2013 +0800
branch test
//用PGP签名的标签是不可伪造的,因为可以验证PGP签名。
6.删除标签
git tag -d tag-name
7.将本地标签推送到远程仓库使用命令git push origin <tagname>
8.一次性推送全部尚未推送到远程的本地标签命令git push origin --tags
9.如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d tag-name
//然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/tag-name
七. 分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。下面我们实战一下--no-ff方式的git merge。
首先,仍然创建并切换dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
修改readme.txt文件,并提交一个新的commit:
$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge
1 file changed, 1 insertion(+)
现在,我们切换回master:
$ git checkout master
Switched to branch 'master'
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
可以看到,不使用Fast forward模式,merge后就像这样: