git config --global user.name "Your Name" |
设置名字 |
git config --global user.email "email@example.com" |
设置邮箱 |
git commit --amend --author='Your Name <you@example.com>' |
如果名字邮箱有误,可以修改 |
git init |
初始化1个git仓库 |
git add |
添加文件到仓库 |
git commit -m |
提交更改,-m为此次提交的说明(message) |
git status |
查看仓库当前的状态 |
git diff |
文件被修改后,查看修改的内容 |
git log |
提交的历史版本信息(从最近到最远罗列历史提交的信息) |
HEAD |
表示当前版本 |
HEAD^ |
表示上1个版本 |
HEAD^^ |
表示上上个版本 |
HEAD~100 |
表示往上100个版本 |
git reset --hard HEAD^ |
回退到上个版本 |
git reset --hard 3628164 |
如果回退后希望撤消回退,可以直接在hard后面写上最后1次提交版本的commit id,一样重新回到最新版(条件是当前终端命令行没有关闭) |
git reflog |
用来记录你的每次命令,场景:关掉了终端,希望撤消这次回退,则可用来查找最新的版本的commit id |
工作区 |
就是在电脑中能看到的目录 |
版本库 |
工作区有1个隐藏目录.git,这个不算工作区,而是git的版本库: 版本库里存了很多东西,其中最重要的就是称为stage(或叫index)的暂存区,还有Git为我们自动创建的第1个分支master,和指向master的1个指针叫HEAD |
暂存区(stage或index)(概念重要) |
git add
实际上就是把文件的修改添加到暂存区 |
管理修改 |
git跟踪并管理的是修改,而非文件 |
git diff HEAD -- <fiel> |
查看工作区和版本库里面最新版本的区分 |
git checkout -- <file> |
放弃工作区的修改,把<file>文件在工作区的修改全部撤消,让这个文件回到最近1次git commit 或 git add 时的状态 |
git reset HEAD <file> |
把暂存区的修改撤消掉(unstage),重新放回工作区 |
git reset |
既可以回退版本,也能够把暂存区的修改回退到工作区。当我们用HEAD时,表示最新版本 |
git rm <file> |
在版本库中删除某个文件,如果1个文件已被提交到版本库,那末你永久不用担心误删,但是要谨慎,你只能恢复文件到最新版本,你会丢失最近1次提交后你修改的内容 |
创建SSH Key |
$ ssh-keygen -t rsa -C "youremail@example.com" |
SSH本地文件 |
主用户目录>>/.ssh/id_res.pub里面的是公匙,在github新加SSH Key的时候把里面的内容复制过去 |
关联远程仓库 |
$ git remote add origin git@github.com:Jiayupeng/learngit.git |
git push |
把本地库的内容推送到远程,实际上是把当前分支master推送到远程 |
git push -u origin master |
加上-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或拉取时就能够简化命令 |
git push origin master |
从现在起,只要本地做了提交,就能够通过此命令同步到远程仓库 |
小结 |
|
git clone |
克隆远程库到本地 要有需要克隆的远程库的地址如:git@github.com:Jiayupeng/gitskills.git,在github仓库页面能找到,ssh支持的原生git协议速度最快 |
git checkout -b dev |
创建dev分支,然后切换到dev分支,git checkout 命令加上-b参数表示创建并切换,相当于以下两条命令: |
git branch dev |
创建dev分支 |
git checkout dev |
切换到dev分支 |
git branch |
查看当前分支 |
git merge |
用于合并指定分支到当前分支,如 git merge dev |
Fast-forward |
1种合并模式,快速合并,只是改变指针的位置而已 |
小结: |
git鼓励大量使用分支 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b <name> 合并某分支到当前分支:git merge <name> 删除分支:git branch -d <name> |
git log --graph |
可以看到分支合并图 |
$ git log --graph --pretty=oneline --abbrev-commit |
上面那个命令的扩大,多了几个命令 |
手动解决冲突 |
如果两个分支都对同1个文件进行了修改,合并的时候会出现冲突,这时候候需要手动解决冲突 |
--no-ff |
git merge 的禁用Fast forward模式,具体命令: |
git merge --no-ff -m"merge with no-ff" dev |
如果要强迫禁用Fast forward模式,Git就会在merge时生成1个新的commit,这样,从分支历史上就能够看出分支信息 |
开发中分支策略的几个原则 |
|
|
|
|
|
小结 |
|
git stash |
当需要修复1个bug,而dev分支的内容还没有提交(还不能提交,功能未完成),这个命令可以把当前工作现场“蕴藏”起来,等以后恢复现场后继续工作 |
git stash list |
存储的stash,要恢复原来的工作现场,有两种方法: |
git stash apply |
恢复stash,但是还需要用git stash drop来删除 |
git stash drop |
当用git stash apply恢复stash后,需要用这个命令来删除这个stash |
git stash pop |
恢复stash的同时,把stash的内容也删掉 |
git stash apply stash@{0} |
可以屡次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash |
小结: |
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; |
|
当手头工作没有完成时,先把工作现场git stash1下,然后去修复bug,修复后,再git stash pop,回到工作现场。 |
git branch -D <branch name> |
如果要抛弃1个没有合并的分支,用这个命令,强迫删除1个分支 |
git remote |
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默许名称是origin。 此命令,查看远程库的信息。 |
git remote -v |
显示更详细的信息,显示了可以抓取和推送origin地址 |
git push origin master |
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上 |
git push origin dev |
要推送本地其他分支到远程,就把后面的本地分支名字改成当前要推送的分支名便可 |
哪些分支需要推送? |
master和dev需要,不过bug分支只用于本地修复bug,没推送必要,feature分支是不是推到远程,取决于你是不是和你的小火伴合作在上面开发。 |
git checkout -b dev origin/dev |
当从远程clone下来后,默许只有本地的master分支,如果要在dev分支上做修改,需要使用这个命令,创建远程的origin的dev分支到本地 |
git pull |
如果其他人对一样的文件做了修改,而自己一样往远程push,则会产生冲突,解决方案是先用git pull 把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,在推送 如果pull失败,根据git的提示,使用下面的命令: |
git branch --set-upstream-to=origin/<branch> dev |
设置dev和origin/dev的链接,连接后,再次pull就能够成功了 |
git commit -m |
pull成功但是合并有冲突,以后手动解决冲突,再次commit,然后再推送到远程origin |
多人协作的模式通常是这样: |
|
会出现的问题及解决 |
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。 |
小结 |
|