日常常用git操作
学习廖雪峰git教程简单的笔记以及日常中的git操作心得。
关于git
git 分布式版本控制系统,分布式版本控制系统没有中央服务器,每个人的电脑上都是一个完整的版本库,所以工作的时候就不用联网了。多人协作的时候,只需要把自己的修改推送给对方。但是在实际使用的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能两个人不在同一个局域网内,两台电脑互相访问不了。所以分布式版本控制系统通常也有一台充当“中央服务器”的电脑。
创建版本库
版本库中的所有文件都可以被git管理起来
git status 查看工作区与最后一次提交的版本之间是哪个文件被修改了,git diff 是看文件被修改了什么
git log –petty=online 用于查看简化的提交信息
git reset –hard HEAD^ 回到上一个版本
git reflog 是用来记录当前所有对分支造成影响的操作,这可以看到版本号
git reset –hard 版本号 用于回到在git reflog 中显示的任意的版本号
工作区与暂存区
工作区有一个隐藏目录.git,这个不算工作区,而是git的版本库
git 的版本库中包括stage的版本区、我们保存的分支和指向当前分支的指针head
git add 是将工作区的修改放到暂存区,git commit 是将暂存区的修改一次性的提交到分支
管理修改
git diff HEAD – filename 命令可以查看工作区和版本库里面最新版本的区别
撤销修改
git checkout – file可以丢弃工作区的修改 ,若是修改后还没有被放到暂存区,撤销修改后会回到和版本库一模一样的状态
若是文件已经被添加到暂存区了,但是还没有提交,撤销修改后就回到添加到暂存区后的状态。
删除文件
git rm filename
远程仓库
git remote add origin 地址/.git 添加远程仓库
git push origin 。。。
分支管理
当创建一个分支dev 时,分支的dev指针最先指向的是master
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
用git log –graph命令可以看到分支合并图
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
bug分支
git stash 用来暂存未经commit 的分支现场,然后切换到另一个分支上进行bug修复,
恢复工作现场的方法是:
* git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
* 另一种方式是用git stash pop,恢复的同时把stash内容也删了
标签管理
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),
所以,创建和删除标签都是瞬间完成的。tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
命令git tag
用于新建一个标签,默认为HEAD,也可以指定一个commit id :git tag commit.id ; git tag -a
-m “blablabla…”可以指定标签信息; git tag -s
-m “blablabla…”可以用PGP签名标签; 命令git tag可以查看所有标签。 git show
查看标签信息 命令git push origin
可以推送一个本地标签; 命令git push origin –tags可以推送全部未推送过的本地标签;
命令git tag -d
可以删除一个本地标签; 命令git push origin :refs/tags/
可以删除一个远程标签
github
参与开源项目 先 fork 项目到自己的账户,然后从自己的账户下clone 项目到本地,只有从自己的仓库进行clone,才能推送修改,然后可以送pull request给官方仓库来贡献代码
.gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
强制添加被.gitignore忽略的文件:git add -f filename
发现可能.gitignore存在问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查 :
git check-ignore -v filename
日常操作记录
- 从远程pull一个分支dev到本地分支dev-test
|
|
这样会直接创建一个新的分支dev-test。
- 在本地Dev分支创建分支dev-test
|
|
这个dev-test分支会直接从dev中复制过来内容,而(1)中的dev-test则在创建时为空。
推送本地分支dev-test到远程dev
1git push origin dev-test:dev从一个现有的本地仓库 clone到本地的另一个仓库
1git clone /e/aaanow/remote/testGit.git从现有仓库连接这个刚刚clone的仓库
1git remote add <name> /e/aaanow/remote/testGit/.git
git stash
与git stash pop
git stash
用来暂存当前正在进行的工作。用于当想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了修复一个紧急的bug,先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。123$git stash$do some work$git stash popgit stash save
与git stash list
Git stash save “work in progress for foo feature”
当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,
git stash list
命令可以将当前的Git栈信息打印出来,你只需要找到对应的版本号,例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。1234567git stash # save uncommitted changes# pull, edit, etc.git stash list # list stashed changes in this gitgit show stash@{0} # see the last stashgit stash pop # apply last stash and remove it from the listgit stash --help # for more infogit commit --amend
用于修复上次已提交的文字git reset --soft 版本号
与git reset --hard 版本号
git reset --soft 版本号
是回到版本号所在的版本,即不再有这个版本号之后的版本,但是工作区仍存在这个版本号更改之后的代码。此命令可用于合并几次提交去除冗余的提交提示 的情况。git reset --hard 版本号
是回到版本号所在的版本,即不再有这个版本号之后的版本,并且工作区也不存在这个版本号更改之后的代码。此命令可用于去除不用的功能。
若是想找到去除的代码,可用下面的命令:12git refloggit reset --hard 版本号git fetch
与git merge
|
|
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
|
|