两张重要的图:


工作区(unstage),add到暂存区(stage),commit到本地仓库(.git)
一、下载版本
正常克隆,本地库名称和远程库名称默认相同
git clone git库地址
正常克隆,本地库名称和原创库名称不同(不建议)
git clone git库地址 自定义名称
二、分支管理
Git鼓励使用分支。代码下载后,默认本地为master分支,建议先创建一个dev或者bug分支开始工作,这样做的好处:
1、便于多分支共同工作,可以及时修复bug;
2、确保不把master搞的乱七八糟,如果新拉分支出来改的有问题,可以快速通过新创建分支完全抛弃之前的分支;
3、多人合作的情况下,别人也在修改,如果直接在master上修改,想在提交前看看别人改了什么,并合并自己的修改就不方便了。
如果不习惯不同分支共享OS文件目录,那就用笨办法,把分支拷贝到另外的目录中修改,然后再合并回来,但是不推荐,违背了git的思想。
查看分支:git branch //查看本地分支 -a 查看所有分支,-r查看远程分支
创建分支:git branch <name>
切换分支:git checkout <name>
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/Release
remotes/origin/master
切换到 origin/Release分支,并在本地新建分支 myRelease
$git checkout -b myRelease origin/Release
Branch myRelease set up to track remote branch Release from origin.
Switched to a new bracdnch 'myRelease'
如果在当前分支的工作尚未完成(尚未提交),又要切换到另外的分支上工作,使用如下两个命令
git stash //临保存存当前工作区
git stash pop // 从之前的状态恢复过来,相当于先用git stash apply恢复,再用git stash drop来删除;
git stash list //查看是否有保存的临时工作区
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
服务端删除分支以后,本地一直还能看到,可参考如下文档中git remote prune origin命令删除,删除之前可先用git remote show origin 查看哪些是无效的。
git远程删除分支后,本地git branch -a 依然能看到的解决办法_W8023Y2014的博客-CSDN博客
三、代码修改和提交
git add file //将制定文件加到暂存区,推荐使用,还是很明确的指定修改了哪些文件更合适
git add . //将所有改动加到暂存区 , 如果直接在当前库中编译代码,不建议使用,因为会产生很多临时文件,不小心就加到库中了;
git commit -m "commit message" //提交所有改动到当前分支
git commit -a -m "commit message" //先add 所有改动,后提交到当前分支 -- 不建议使用,因为会产生很多临时文件,不小心就加到库中了;
git diff //#是工作区(work dict)和暂存区(stage)的比较
git diff --cached //#是暂存区(stage)和分支(master)的比较
git push origin master // 将本地master分支提交到远程仓库
git push origin branch-name //提交到指定远程分支
命令行太长,可以使用别名。比如 git config --global alias.shotname "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong command"
还原工作区乱七八糟的修改用git-clean - Remove untracked files from the working tree
git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…?
git clean -d -f //强制删除所有untracked files
git clean -n //显示将被删除的untracked files
四、版本回退(还没有提交到远程仓库之前)
场景1(没有Add):当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令:
git checkout -- file //放弃指定文件的修改
git checkout . //放弃所有修改
场景2(已经add,没有commit):当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3(已经commit):已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
git reset --hard HEAD //当前版本
git reset --hard HEAD^ //前一版本
git reset --hard commit_id //指定版本 commit_id使用git log 或者git reflog查看
场景4(已经push)
Git 撤销commit文件 和 回退push的文件 - 简书
git reset --hard commit_id //回退到指定版本
git push --force 会把之前的commit记录都清除,只有owner有这个权限
五、推荐最佳实践
1、clone代码到本地
2、创建开发分支,进行代码修改
创建+切换分支:git checkout -b <name>
3、返回主分支,从远程仓库pull最新代码,合并修改的代码
git pull
git merge --no-ff -m"merge with no-ff" <name>
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$git merge --no-ff -m"merge with no-ff" devMerge made by the'recursive' strategy.
readme.txt |1 +
1 file changed,1 insertion(+)
$ git log--graph --pretty=oneline --abbrev-commit
- 提交到远程库 git push
5、删除临时分支:git branch -d <name> //可选
git fetch
$ git status
On branch master
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
pull=fetch+merge,pull的话,下拉远程分支并与本地分支合并。fetch只是下拉远程分支,怎么合并,可以自己再做选择。
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
六、创建空白xxx分支并提交为远程xxx分支(不用事先在远程库拉分支):
git checkout --orphan xxx
git rm -rf .
拷贝新代码到当前目录以后,执行如下命令
Git add .
Git commit -m “commit xxx code”
git push origin xxx:xxx
切换到master分支Git pull以后,再切换回来状态就正常了
git push origin TENANTV6.01.01:TENANTV6.01.01
git push origin V5.01.07U1:V5.01.07U1
- 分支管理最佳实践
http://blog.jobbole.com/109466/
从上图可以看到主要包含下面几个分支:
- master: 主分支,主要用来版本发布。
- develop:日常开发分支,该分支正常保存了开发的最新代码。
- feature:具体的功能开发分支,只与 develop 分支交互。
- release:release 分支可以认为是 master 分支的未测试版。比如说某一期的功能全部开发完成,那么就将 develop 分支合并到 release 分支,测试没有问题并且到了发布日期就合并到 master 分支,进行发布。
- hotfix:线上 bug 修复分支。
除此之后还可以有 fast-track 等分支。
- tag管理