关于使用git
git本地
下载并安装git
创建git版本库
- 新建空目录
- 初始化仓库:git init
- 添加到仓库 :git add filename
将文件提交到仓库: git commit -m “wrote a file”
commi可以一次提交很多文件,所以你可以多次add不同的文件
本地文件修改后提交
- 修改文件后查看状态:git status
查看两个文件的改变:git diff
要随时掌握工作区的状态,使用git status命令。
如git status告诉你有文件被修改过,用git diff 可以查看修改内容。
版本回退
1.查看提交的历史版本:git log
以一行的方式看(不看详情):git log –pretty=oneline
HEAD表示当前版本
HEAD^表示上一个版本
HEAD^^上上个版本
HEAD~100往前一百个版本
2.回退到上一个版本:git reset –hard HEAD^
后悔了,回退到最新的一个版本:git reset –hard 版本号(要自己保存的)
3.如果自己不造:Git提供了一个命令用来记录你的每一次命令:git reflog
让HEAD指向哪个版本号,你就把当前版本定位在哪
工作区和暂存区
当建立文件后,没添加到暂存区就是untracked
修改后的文件是Changes not staged for commit
添加到暂存区后没有交托给分支Changes to be committed
管理修改
查看工作区和版本库里面最新版本的区别:git diff HEAD – filename
每次修改,如果不用git add
到暂存区,那就不会加入到commit
中。
撤销修改
丢弃工作区的修改:
git checkout -- readme.txt
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况: 一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset HEAD <file>
除了提交到远程版本库的内容都可以修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
- 删除工作区的文件:rm filename
- 删除版本库中的该文件:git rm filename 并确认:git commit -m “reason”
- 从版本库里面恢复:git checkout –filename
远程仓库
- 如果本地主目录没有.ssh目录,创建获得ssh公钥和密钥: ssh-keygen -t rsa -C “youremail@example.com“
- 在github里添加自己的ssh公钥
添加远程库
Create a new repo
远程库关联:git remote add origin git@github.com:karen2066/learngit.git
把本地库的所有内容推送到远程库上:git push -u origin master
实际上是把当前分支master推送到远程
把本地master分支的最新修改推送至GitHub: git push origin 分支名
从远程库克隆
- 新建GitHub仓库
- 克隆一个本地库: git clone git@github.com:karen2066/gitskills.git
- git还听个http协议的地址,但这种方式需要输入口令
分支管理
新建分支:git checkout -b dev
这条命令等于: git branch dev + git checkout dev 两条命令
查看当前分支: git branch
当前分支前面会标一个*号
切换分支:git checkout master
合并分支的工作:git merge dev(dev是分支名称)
git merge
命令用于合并指定分支到当前分支
删除分支:git branch -d dev
当分支提交冲突时:
master上修改,再提交,解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交(再往前提交一个版本相当于就是合并)
查看分支合并的情况:git log
查看分支合并图:git log –graph
分支管理策略
Git的分支管理模式:Fast forward,
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
禁止使用快速合并模式:git merge –no-ff -m “merge with no-ff” dev
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活
加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并
bug分支
把当前工作现场“储藏”起来,等以后恢复现场后继续工作:git stash
查看刚才保存的工作现场:git stash list
恢复现场,但不删除stash内容:git stash apply
恢复现场,同时删除stash内容:git stash pop
可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash: git stash apply stash@{0}
Feature分支
每添加一个新功能新建一个feature分支
丢弃一个没有被合并过的分支,强制删除分支: git branch -d feature-vulcan
多人协作
查看远程库的信息:git remote
查看远程库详情:git remote -v
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库: git push origin master、git push origin dev……
原则:
master
分支是主分支,因此要时刻与远程同步;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
抓取分支
创建远程
origin
的dev
分支到本地:git checkout -b dev origin/dev 另一种:在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;当提交到远程库有冲突时,先Git pull 把最新的origin/dev抓取下来, 本地合并解决冲突再推送
设置
dev
和origin/dev
的链接:git branch –set-upstream-to=origin/dev 再Git pull拉取
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
Rebase
把分叉的提交变成直线
git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
####标签管理
标签是版本库的一个快照,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
#####创建标签
切换到需要打标签的分支上:git branch/git checkout master
打标签:git tag
查看所有标签:git tag
对以前的版本打标签:git tag v0.9 f52c633(commit id)
查看commit id:git log –pretty=oneline –abbrev-commit
注意,标签不是按时间顺序列出,而是按字母排序的
查看标签信息:git show v0.9(tag名)
创建带有说明的标签,用
-a
指定标签名,-m
指定说明文字:git tag -a v0.1 -m “version 0.1 released” 1094adb
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
##### 操作标签
删除:git tag -d v0.1
推送某个标签到远程:git push origin
一次性推送全部尚未推送到远程的本地标签:git push origin –tags
如果标签已经推送到远程,要删除远程标签:
先从本地删除:git tag -d v0.9
从远程删除:git push origin :refs/tags/v0.9
忽略某些文件
创建.gitignore文件,把要忽略的文件名填进去
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore
忽略了:如果你确实想添加该文件,可以用-f
强制添加到Git:git add -f App.class
哪个规则写错了可以用git check-ignore
命令检查:git check-ignore -v App.class
Git会告诉我们,.gitignore
的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
####配置别名
给status配置别名: git config –global alias.st status
配置文件
每个仓库的Git配置文件都放在.git/config
文件中:cat .git/config
别名就在[alias]
后面,要删除别名,直接把对应的行删掉即可
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中:cat .gitconfig
开源Git:
点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:(一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址`git@github.com:twbs/bootstrap.git`克隆,因为没有权限,你将不能推送修改。)
可以在GitHub上发起一个pull request