git下载地址git
https://git-scm.com/github
1.创建本地仓库而且与远端分支相关联
A. git init:本地仓库初始化。//本质上生成了一个.git文件
B. 在远端仓库创建好项目new-project,而且复制远端仓库的地址Git_Url
C. git remote add origin Git_Url//把远端分支和本地分支相互关联
D. git add .//把须要上传的文件从工做空间传到stage缓存区中
E. git commit -m "XXX"//给本次提交添加说明
F. git push -u origin master
注:第一次提交是远端仓库须要说明分支所以须要使用git push -u origin master,后面提交直接git push。缓存
2.clone远端分支项目
A.git clone Git_Url //clone远端完整项目
git branch 显示本地当前分支。
git branch -a 显示本地以及远端分支。
新clone的仓库是只有本地的master分支以及远端的全部分支,若是须要在本地开发远端仓库的某个分支须要把本地分支和远端分支再作一次映射。
B.git checkout -b 本地分支名 origin/远程分支名 //将远程git仓库里的指定分支拉取到本地(本地不存在而且远端已经有的分支)。
C.git push --set-upstream origin 分支名 //推送本地分支到远程仓库
注:若是当前需求为把远端的一个项目迁移到另一个项目中,此时咱们git clone后在该文件目录中显示一个.git文件,这个文件中包含该项目全部的tags,branches,commit message等关联信息,这时再往新的远端分支推送项目时候并不须要所谓的本地仓库初始化等操做(git init),由于自己clone下来的项目就是一个仓库。所以操做过程应该为:(1)git clone //clone项目(2)git remote add origin Git_Url//把远端分支和本地分支相互关联 (3) git push -u origin master //提交代码,并不须要git add、git commit 等操做,同时带.git的项目自动导入所关联的全部tags,branches,commit message等关联信息。app
3.一次完整的提交过程
A.git add 文件名//把文件从本地工做空间提交到本地缓存stage,能够提交屡次不会产生commit_id
B.git commit -m "XXX" //把当前stage缓存区中的全部内容一次性提交到本地分支,会生成新的commit_id。也就是所谓的屡次add一次commit。
C.git push //把本地分支上的全部commit推到于此分支对应的远端分支 master->origin/master
若是在git pull/push/clone中会遇到须要输入username、password的咱们为了方便重复输入会采用两种方式进行身份校验。
1、sshd本地工做空间公钥
2、在git pull http://$username:password@XXXX.git
C.git status //查看本地工做区与本地分支的差别,简言之就是查看工做区域的状态,有哪些文件变动了。
当本地工做空间和本地缓存stage都没有更新或者全部的跟新已经push到远端分支显示"nothing to commit working directory clean"
D.git diff //查看本地工做区与本地分支的差别,具体文件的变动。ssh
4.历史版本信息
A.查看提交的版本信息 git log;每一个log显示一行git log --pretty=oneline
B.git reset --hard commit_id //回退到某个版本
此时再使用git log查看显示的最新一条commit_id则是回退后的最新版本
此时查看git status提示当前版本落后于origin/master远端分几个版本
此时使用git pull指令实质是本地和远端的merge行为。(1)若是没有对该版本作修改,git pull直接fast-forward到远端origin/master的最新版本。(2)若是对老版本执行的单纯的增量,git pull是执行远端和本地的合并,注:单纯的递增是不会引发冲突,结果为远端的最新版本再加上刚才的增量部分。(3)若是对老版本执行增删改操做(都有),git pull 会产生冲突解决冲突后,再git add 、git commit 、git push。
注:冲突以前的commit也会是一次commit记录而且推到远端分支。
C.因为当前的最新git log显示的旧版本的commit_id。所以若是想恢复到远端分支origin/master的最新版本:(1)执行git pull 实现fast-forward。(2)使用git reflog查看头指针HEAD的变化状况,找到原来的回退前的commit_id。而后再执行git reset --hard commit_id回退到最新版本。学习
5.撤销修改
A.git checkout -- 文件名 //把当前工做区的内容恢复到上一个状态(上一个状态:本地分支的最后一次commit状态)。
B.git reset HEAD 文件名 //把当前stage缓存区的内容送回到本地工做区,不管缓存区有多少次add。
用例:在hi.sh文件中本地添加"add something",git add 添加到缓存区,本地添加"add anything";
(1)执行 git checkout -- hi.sh ,文件变成只有"add something"的变动 //git checkout 只是撤销了本地工做区域的变动;执行 git reset HEAD 文件名 ,把缓存区的内容清空,可是文件内容为"add something",当前文件状态为本地缓存区为空,变动只存在于本地,所以再执行 git checkout -- 文件名,把本地的此次变动回退到本地分支的最后一次commit状态。
(2)执行 git reset HEAD 文件名,把缓存区的内容清空,文件状态为"add something" & "add anything"两次本地变动,再执行git checkout -- 文件名,把本地的两次变动回退到本地分支的最后一次commit状态。
总结:git checkout 是撤销本地变动的,不管是多少次变动,或者是从缓存区回退回来的内容统一的退到本地分支的最后一次commit状态(理解:已经从本地工做区域推到本地缓存的内容不会回退)。 git reset 把当前stage缓存区的内容送回到本地工做区,不管缓存区有多少次add。指针
6.删除文件
A.删除文件通常流程(理解为一次提交和git add同样) (1)rm 文件 //本地删除(2)git rm 文件//把删除提交到缓存区(过程同git add) (3)git commit -m "XXX" (4) git push
B.文件误删恢复。本地误删 rm 文件:git checkout -- 文件名。
直接缓存区误删 git rm 文件:(1)git reset HEAD 文件名 //恢复缓存区(2)git checkout -- 文件名 //恢复本地开发
7.分支管理
A.基本分支操做:(1)拉取本地不存在的远端分支以及把本地的分支推到远端仓库的操做在第二小节中明确说明。(2)查看本地分支git branch;查看本地的远端分支git branch -a(注:刚clone下来的项目中包含全部的远端分支,并无直接映射到本地,须要本地建立分支且与本地远端分支相互关联[通常采用相同的名字,git自动作track])。(3)建立分支:方式一 git branch <branch_name> //建立分支; git checkout <branch_name>//切换到新建立的分支。 方式二 git checkout -b <branch_name> //建立分支并切换 (4)合并分支:git merge <branch_name>//把其余分支合并到当前分支(注:合并以前须要把分支上的修改先进行提交[git add、git commit],若是当前代码还不能提交采用git stash[后边详细介绍]保留当前变动后,再实现分支的合并) (5)合并后删除无效分支(若是没有合并就删除,系统会提示。删除本地分支git branch -d <branch_name>;删除远端分支 git push origin --delete <branch_name> (6)对于合并后的分支能够直接删除,也能够再把主干分支的代码向该分支merge,执行git checkout release ,执行git merge master,须要注意的是不管原master分支作了什么变动,当前的主干分支和release分支都处于merge状态,所以当把主干分支merge到release分支上面时"必定不会"产生complict冲突。(7)强制删除分支(不须要合并等操做):git branch -D <branch_name>
B.分支冲突:
用例:在子分支上面有新的commit,在主干分支上面也有新的commit,而后执行git merge release会发生冲突,冲突的信息写在发生冲突的文件夹中,手动处理冲突后,再次git add、git commit、git push
C.保存工做现场并恢复:
用例:当前分支的变动尚未commit,此时须要checkout到其余分支进行开发工做,须要保存当前的工做现场,并须要在后边作恢复。
方式一:保存当前工做现场git stash;查看缓存列表git stash list;恢复某一次工做现场 git stash apply stash@{0};删除这个现场记录 git stash drop
方式二:保存当前工做现场git stash;恢复某一次工做现场而且删除记录 git stash pop。
注:虽然能够保存屡次工做现场,但在实际工做这种状况不多见。
D.分支结构以及提交记录(主要是看合并的结构):
git log --graph --pretty=oneline --abbrev-commitrem
为增强对于分支的理解上图:get
a.只有一个主干master分支
git-br-initial
b.在master分支上切dev分支
git-br-create
c.在dev分支上有一次commit
git-br-dev-fd
d.git checkout master //切换到master分支
git-br-on-master
e.把dev合并到master分支
git-br-ff-merge
f.在master和feature分支上各自有一次新的commit
git-br-feature1
g.在master和feature分支上各自有一次新的commit,并别合并
git-br-conflict-merged
注:若是对于分支进行深度学习请参考Yuqi Chou推荐的https://github.com/pcottle/le...
8.标签管理(首先checkout到须要打标签的分支)git tag <tag_name> //默认给最新的一次commit上面打标签,后面能够跟任意一个commit_id。git tag -a <tagname> -m "XXX"//加message的打标签方式,默认给最新的一次commit上面打标签,后面能够跟任意一个commit_id。git tag //查看本地全部标签git show <tag_name>//查看标签信息git push origin <tagname>//推送一个标签到远端仓库git push origin --tags//推送所有本地标签到远端仓库git tag -d <tagname>//删除一个本地标签git push origin :refs/tags/<tagname>//删除一个远端仓库标签