常用操作
Git status 查看本地状态
Git log 查看提交过的版本
Git checkout 取出任意历史版本
建立分支 git branch branch_name / git checkout –b branch_name
合入:将分支合入当前分支
1. Git checkout master_branch
Git merge 待合入分支
存在环
2. git checkout master_branch
Git rebase待合入分支
git log –oneline --graph 查看分支合入的图形显示
提交到暂存区 git add
提交至本地 git commit –m description
Git commit –amend 覆盖之前提交记录
提交到公司代码库 Git push origin HEAD:refs/for/master
HEAD:refs/for/master 这是一个评审分支
Rebase merge区别
Rebase
特点:干净的、线性的提交历史
git rebase 操作:
把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上
merge
特点:保存项目完整的历史,并且避免重写公共分支上的 commit
Fetch与pull区别
Pull
首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为git pull是git fetch和git merge两个步骤的结合。
命令:
git pull <远程主机名> <远程分支名>:<本地分支名>
//取回远程主机某个分支的更新,再与本地的指定分支合并。
Fetch
更新git remote 中所有的远程仓库所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中
冲突解决
- 在本地仓库中,更新并合并代码
Git fetch origin
Git rebase origin/master - 依据提示分别打开冲突的文件,逐一修改代码
- 所有冲突都修改完毕后,提交修改的代码
Git add –u
Git rebase –continue - 更新patch
Git push origin HEAD:refs/for/master
项目开发
项目建立
- cd ~/workspace/git/ // 进入你个人的工作目录
- mkdir project_name // 新建一个目录用于存放代码,名称可以和远程仓库名称一样
- cd project_name // 进入你新建的目录
- git init // 使用git初始化这个目录为一个git仓库
- git remote add origin git@github.com:22th/oh-my-zsh.git // 关联本地仓库到一个远程仓库
- git fetch --depth=1 // 更新远程仓库的一些信息到本地,比如分支信息等
- git checkout -b master origin/master // 检出一个分支master并关联远程的master分支
- git pull // 更新本地仓库代码
通过以上流程就可以将远程项目同步到本地,现在默认的是远程的master分支,你不可以在master分支修改代码,一般来说你也没有这个权限。 同步代码到本地之后,你需要根据业务需求,新建一个开发分支,名称更具你的需求来调整,比如你要开发一个新功能,那你就建一个feature-xxx分支,如果你是解决一个bug,你可以建一个hotfix-xxx分支。新建分支不建议从本地建,你应该从git仓库管理后台新建,然后再检出到本地。管理后台新建分支很简单,不说了。
然后你就将你新建的分支check到本地,命令如下:
git checkout -b feature-xxx origin/feature-xxx
项目开发
- git add // 将工作区修改添加到暂存区,加上 --all 参数表示将所有修改添加到暂存区
- git commit -m “msg” // 将暂存区的修改添加到版本库
- git push -u origin feature-xxx // 将本地仓库中的修改推送到远程
- git status // 查看当前工作区间状态
- git log // 查看历史commit
- git checkout – // 用最后一次commit的文件替换当前工作区间的文件
- git reset --hard // 丢弃工作区间所有修改,回滚到上一个commit状态
- git checkout <版本号> // 回滚到指定版本
tag
tag有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。
git show : 查看所有tag
git tag –a tag_name –m tag_description : 创建annotated tag
git tag -a tag_name : 创建lightweight tag
git tag –d tag_name : 删除tag
git push origin <tag_name> : 推送某个tag至远程
git push origin –tags : 推送所有tag至远程
撤销
修改最后一次的提交
Git commit –amend 利用当前暂存区快照重新提交,但会覆盖上一次的提交。
撤销已暂存的文件
Git reset HEAD file1 工作区file1的状态被恢复到暂存区中有关file1的状态,暂存区中file1将会消失
撤销对文件的修改
Git checkout – file_name
回滚
Git reset –hard commit_id 将工作区回滚到commit_id所指的提交的状态
创建patch
git format-patch
为从commit_id开始算起的n个commit做patch
git format-patch commit_id -n
为commit_id1和commit_id2之间的几个commit做patch
git format-patch commit_id1…commit_id2
git diff
git diff commit_id1 commit_id2 > diff_file_name
合并patch
检查是否可以合入patch
git apply --check path/to/xxx.patch
git apply --check path/to/xxx.diff
合入patch
git apply path/to/xxx.patch
git apply path/to/xxx.diff
或者
git am path/to/xxx.patch
代码与patch冲突解决:
首先先合入不冲突代码
git apply --reject xxx.patch
解决冲突后
git add modify_name_file
git am --resolved
git am --continue
跳过冲突
git am --skip
回退打入的patch
git am --abort
参考:
https://blog.csdn.net/riddle1981/article/details/74938111