git(分布式管理系统)
git本地操作
-
git config
git config --global user.name "Your Name"
git config --global user.email "email@example.com" -
git log
git log --oneline oneline为--pretty=oneline --abbrev-commit简写
git log -p 查看提交记录,并且展示具体修改
git log --author=< somebody > --grep fix 过滤查看某人的某次提交工作内容(commit message) -
git reflog
git reflog --oneline 列出所有操作记录,包括提交、切换分之、合并分之等 -
git reset --hard [HEAD | commitId] (HEAD指当前版本)
git reset --hard HEAD^ 回退到上次提交版本
git reset --hard HEAD^^ 回退到上上次提交版本
.....
git reset --hard HEAD~10 回退到十次提交以前
git reset --hard e8f8gd 回退到e8f8gd 这一次
git reset -–hard origin/master 回退到与远程master代码一样git reset --soft HEAD^ 回退到上次暂存区状态
git reset --mixed HEAD^ 回退到上次工作区状态
以此类推.... -
git diff 比较的是工作区和暂存区的差别
git diff --cached 比较的是暂存区和版本库的差别
git diff HEAD 可以查看工作区和版本库的差别
git diff 分支1名 分支2名 文件名 分之可以为本地分之,也可以为远程分之 -
git checkout -- readme.txt 丢弃工作区的修改
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次git commit或git add时的状态。
-
git reset HEAD <file> 回退暂存区到工作区的修改,再执行git checkout -- <file> 将会回退到上一次提交时的版本
-
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
-
git rm readme.txt rm 参数为 add 取反删除
-
git clone < git@github.com:xxx/xxxx.git >
git 分之操作管理
-
git checkout -b dev 新建一条dev分之,并切换(-b)到dev分之
git checkout -b dev = git branch dev + git checkout dev
git checkout -b 本地分支名 origin/远程分支名 从远程拉取一条本地不存在的分之并切换到上面 -
git branch 查看当前本地所有分支
git branch --merged 查看已经合并到当前分之的分支 --no-merged 没有合并过的分支
git branch -d dev 删除dev分之
git branch -D dev 强制删除没有合并过的dev分之
git branch --set-upstream-to=origin/dev dev 将远程dev分之与本地dev 分之关联起来。下次直接git pull 或者 git push 就可以了,不用带远程分之名称 -
git merge dev 将dev分之修改内容合并到当前分之上
-
git rebase 变基操作
下面用例子来区分rebase与merge区别:- 假设有master分之, 我们在master提交一次C1。
- 然后检出分之dev 提交两次C2
- 然后切换分之到master,然后提交一次C3并且C3与C2修改了同一行代码,造成冲突
- 然后再在master 上提交一次C4
- 然后切换到dev 上提交一次C5
- 这时切换到master上合并dev git merge dev 生成的提交线为 C1 > C2 > C3 > C4 > C5 > C6,这是按照提交事件来进行合并,C6 为你解决了C2与C4造成冲突的新修改
但是, 用rebase就得到的不一样结果, - 假设现在没做上次 merge 操作,
- 然后git rebase master,这时候 git提示出现了代码冲突,此处为之前埋下的冲突点,处理完毕后 git add . ( 添加冲突处理后的文件),
- git rebase --continue (加上--continue参数让rebase继续处理),
- 然后git checkout master ,git merge dev
- 这时候master处理完的提交线为 C1>C3>C4>C2>C5, 能够看出dev是变基线为master最新一次提交,然后再合并dev两次提交。
注意
-
git stash // 暂存工作区
git stash apply <暂存记录,不写默认最近一次>将暂存区内容恢复到工作分之
git stash list 查看多次暂存记录
git stash drop stash@{0} 将stash@{0}次暂存删除
git stash pop <暂存记录,不写默认最近一次> 将暂存区内容恢复到工作分之并删除暂存
git stash branch <newbranch> 将暂存内容恢复到一个新分支上 -
分支策略
- 在实际开发中,我们应该按照几个基本原则进行分支管理:
- 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
- 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
- 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
- 如果有bug需要修复,则切换到需要修复分之,然后检出新分支比如 bugfix 分之进行修复部署
- master release hotfix develop feature 分之个人理解
-
多人协作
- 多人协作的工作模式通常是这样:
- 首先,可以试图用git push origin < branch-name >推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin < branch-name >推送就能成功!
- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令**git branch --set-upstream-to=origin/< branch-name > < branch-name > **。
-
常常令人窒息的操作
-
git cherry-pick选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)
- 比如B分之想合并A分之的某一次commit
- 首先git log 找到A上面提交的commitId记录下来,然后git checkout b,
- 然后git cherry-pick commitId or git cherry-pick commitId1..commitId100(不包含开始的第一个commitID1,包含最后commitId100)
-
git rebase -i < commitId > 弹出某次commitId 到至今的提交记录
- 上面操作会打开提交记录
pick 4968689 添加了一个文件A
pick 7a1d0c0 添加了一个文件B - 如果想删除 添加了一个文件A 这次提交,则将最前面pick 改为drop,然后wq退出,则删除
- 如果想同步到远程仓库 git push -f (再次提醒该命令慎用!!)
- 上面操作会打开提交记录
-
git revert 不一样的版本回退
-
首先找到想回退的版本ID git log
-
git revert < commitId >
-
会生成一次新的提交,文件内容将删除commitId这一次的提交
-
git revert -n commitID1..commitIDN 回退这两次版本之间的版本(不包含commitID1, 包含commitIDN),但是不会生成一次新的commit,需要手动add,commit
-
-
git fork
- git fork 不是一个命令
- fork 是在远程拉取一个与原代码库(A)一模一样的一个自己的库(B)。
- 要想同步原代码库(A)到本地代码(C),则先绑定主机到本地
- git remote add upstream https://github.com/原代码库/xxx.git
- git remote add origin git@github.com:my/xxxx.git
- 绑定完git fetch upstream 拉取原代码库(A)的代码
- git merge upstream/master 将master分之代码同步到本地,然后可以进行修改
- git push origin master 推到自己的代码库,之后再可以发起merge requset到原代码库
-
git cherry-pick选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)
git tag
- git tag 查看所有tag
- git tag <tag name> 打一个tag
- git tag <tag name> <commitId> 在某一条commit上打tag
- git tag <tag name> -m <message> 打上tag并且添加message
- git push origin <tag name> 将tag push到远程
- git tag -d <tag name> 本地删除某个tag
- git push origin :refs/tags/<tag name> 远程删除tag
git 远程操作
- git remote add origin git@github.com:xxx.git 添加远程主机关联
- git remote prune origin --dry-run 看看有哪些没用的分支需要清除
- git remote prune origin 清除跟踪
- git push --set-upstream origin/master master 关联本地分之于远程分之
- git push -f 强制提交,尽量不要使用!!!!
git 提交部分文件或文件夹到别的分支
- 假设现在有个需求,要将master代码打包到dist文件夹中,这时候本地.gitignore忽略了dist文件夹,但是别的分支又需要这份dist打包好的项目。此时远程有master,本地也有master,再无别的分支。
- 本地git checkout -b other, git add -f dist, git commit -m "init other", git subtree push --prefix dist origin other 这样下来,other分支只有dist文件夹了。
本文作者原创,仅供学习交流使用,转载需注明出处。
网友评论