第一部分 基本操作
以Ubuntu16.04操作系统为例(其他系统类似),主要记录常用的、基本操作:
0. 安装Git 分散型版本控制系统(CVS);
sudo apt-get install git
1. 初始化本地配置git或其他配置等(配置仓库或者全局选项,一般保存在.gitconfig中)
git config --global user.name "your_name"
git config --global user.email "your_email@example.com"
git config --global color.ui auto
git config --global core.editor vim
2. 创建git目录仓库(以git_dir为例)(git_dir下会生成一个.git的工作树保存仓库状态信息)
mkdir git_dir
cd git_dir
git init
3. 如果需要使用到github,则还需要设置github的SSH Key;并将生成的id_rsa.pub公开密钥的内容添加到github的SSH Key
ssh-keygen -t rsa -C "your_email@example.com"
4. 查看仓库状态
git status
5. 向暂存区中添加文件
git add some_file
6. 将暂存区文件提交到仓库的历史记录区(版本区)中
git commit -m "some commit information strings"
或者直接git commit,后进入编辑器编辑模式,保存提交的详细信息;若不再提交,则提交信息留空直接关闭编辑器即可。
此外也可以将向暂存区添加文件与提交到历史记录区简化合并为: git commit -am “some commit information strings”
7. 查看仓库提交日志信息
查看仓库的提交日志:git log
或者查看简述信息:git log --pretty=short
查看指定目录、文件的提交日志信息:git log some_file
查看文件的改动信息: git log -p 或者git log -p some_file
查看当前仓库的操作日志:git reflog
reflog与log的区别,前者可以查看所有操作历史记录日志,而后者至多查看到当前所在hash index为止的历史记录(比如回溯到某个历史版本时的位置)
8. 查看更改前后的差别
查看工作区与暂存区的差别: git diff
查看工作区与历史记录区的差别: git diff HEAD
查看暂存区与历史记录区的差别; git diff --cached 或者git diff --staged
9. 显示当前分支列表
git branch
10. 创建并切换分支(feature_A)
创建分支feature_A:git branch feature_A
切换到分支feature_A:git checkout feature_A
或者git checkout -b feature_A
切换到主分支(默认分支): git checkout master
一般情况下,主干分支master作为稳定发布的分支,可能有多个不同的特性分支(特性分支从主干分支master分支)作为不同主题实现,
此外还有bug分支(也从主干分支master分支出来的)以修复BUG;此后再与master合并;
另外主干分支可能需要Tag标签来创建版本信息,同时管理多个发布版本,拥有多个版本发布时,主干分支也有多个。
11. 分支合并
切回到主干分支:git checkout master
合并feature_A到主干分支: git merge --no-ff feature_A
12. 以图表形式查看分支
git log --graph
13. 回溯分支历史版本(e411dea1c 为历史提交记录的某个指定的历史记录点下简化了的hash index值,可以使用全hash值或者简化的)
git reset --hard e411dea1c
14. 推进分支历史版本(86f40a1 为推进历史记录版本下的某个指定历史记录点hash index值)
同回溯分支版本一样,不过需要结合git reflog得到相应的hash index值,并结合git reset --hard 86f40a1
15. 修改上一次提交的信息内容
git commit --amend
此后编辑修改该编辑器中对应的内容,保存并退出即可
16. 更改压缩历史记录信息(n为某个可压缩的记录条数)或者称为变基
git rebase -i HEAD~n
17. 添加远程仓库并推送至远程仓库
需要先在github上创建同名仓库,如git_dir;
添加远程仓库,将其设置为本地仓库的远程仓库(origin为标识符):git remote add origin git@github.com:your_acount/git_dir.git
此外也可以先在github上创建仓库后,拉取下来然后添加文件修改,再提交也可,而不需要添加远程仓库操作;
推送至master分支(当然也可以推送其他分支,如feature_A):git push -u origin master
18. 获取远程仓库(从远程仓库拉取克隆到本地)
git clone git@github.com:your_acount/git_dir.git
19. 查看所有的分支信息(含远程仓库的)
git branch -a
20. 获取远程仓库的某个分支(如:feature-A)
git checkout -b feature-A origin/feature-A
21. 推送当前分支
git push
22. 获取最新的远程仓库分支(如: feature-A)
git pull
另外也可以获取某个分支:git pull origin feature-A
23. 移除某个文件
移除暂存区和工作区的某个文件:git rm some_file
移除分支版本区的某个文件:git rm --cached some_file
24. 修改某个文件的名称
git mv old_file_name new_file_name
第二部分 常用实践
1. Git仓库提交代码格式:
前者:一般优化修改代码、重构之类的;
后者:主要涉及到功能更新、增加、BUG修改。
【XXX项目模块】【bug:#0】【改动模块:shellext】【】
【XXX项目模块】【bug:#0】【改动模块:shellext】【原因:】【处理:】【影响:】
2. 常用指令:
git status
git log / git log -p 查看提交日志记录
git log --graph 可查看分支合并图
git pull
从远程origin分支拉取最新代码并合并到本地master分支,相当于git fetch + git merge;
git pull origin master
此外,git pull --rebase 即:git fetch + git rebase master,拉取分支并通过变基来再次变基,使得提交历史整理为直线,
此主要用到若远程分支变基了,拉取下来后更新本地分支实现变基(清理历史)。避免将本地就提交再次还原了远程分支的变基目的。
(也即是用变基来解决变基问题)
git push
推送本地master分支至远程origin分支仓库:
git push origin master(本地分支对应名称)
或者当为origin和master时,可简写:git push
git commit -m "some log infos"
git checkout -- xxxx.somefile // 会回退源码,工作区的修改会被清空覆盖,危险
git checkout somebranch 切换分支
git checkout -b newbranch 创建并切换分支
git rebase some_branch rebase变基操作可以把本地某分支的push提交历史整理成直线,将修改其父指针重新指向some_branch;
此操作可能导致难以跟踪提交历史记录原始的所在提交分支(本质上,这是线性化的自动所有的cherry-pick id操作,即等同于将本分支所有的提交commit id依次cherry-pick到some_branch分支,形成直线)。与merge操作不同。
回退commit(未push):git reset --soft some-commit-id (工作区的修改仍保持)
回退版本(会回退源码,工作区的修改会被清空覆盖,危险): git reset HEAD --hard some-commit-id,
然后执行:git push origin HEAD --force 将本地强制推送到远程。
说明:
git reset --hard HEAD somefile/some-commit-id
撤销更改另一种方式:git revert
强制覆盖本地代码,并获取最新代码(若有本地修改,建议先备份本地修改代码文件):
git fetch --all
git reset --hard origin/master或orgin/其他的对应分支(如:orgin/func_v10_personal_document_20180130_branch)
git pull
冲突时:
解决冲突,后git rebase --continue跳过冲突,后执行其他需要的操作。
从一个分支cherry-pick(类似于复制操作,只是新产生的提交commit id不同而已)一个或多个commit到另一个分支(当前):
(commitid为被复制提交分支对应的id)
单个commit只需要git cherry-pick commitid
多个commit 只需要git cherry-pick commitid1..commitid100 (区间说明:(commitid1..commitid100],左开右闭)
或者用:git rebase --onto some-branch somebegin_commitid,即从当前分支的somebegin_commitid开始的以后提交commit重演(cherry-pick)到some_branch分支,
而不用一条一条地cherry_pick;
另一种不同于merge的合并分支的方式:
git rebase master (在some-branch分支执行该语句)
git checkout master(再从some-branch分支切换到master分支)
git rebase some-branch(再将当前master分支移动到some-branch分支所在的指针指向位置即可)
(git rebase master,表示表示将当前some-branch分支复制移动到master分支前端使得成为线性)
将本地仓库关联并推送到一个远程仓库,使用命令:
添加一个远程分支origin(或其他名称)名称对应的somegit-address远程分支:
git remote add origin(远程分支对应名称,也可修改为其他分支名称) somegit-address(远程分支git地址)
建立origin/master分支与本地的master对应的链接关联关系:git branch --set-upstream-to=origin/master master
将本地分支master推送到远程仓库分支origin:
git push origin master
注意可以将本地分支关联到不同的远程仓库,只要对应分支名称不同即可,以及远程分支git地址不同即可,这样切换分支名称
即可切换关联到的不同远程仓库。
移除本地与远程仓库的关联分支:
git remote remove origin(远程分支对应名称,也可修改为其他分支名称)
分支合并:
1. 切换到合并分支(作为当前分支)
2. git merge other-branch,合并其他分支到当前分支
若为:git merge --no-ff -m "some log infos" other-branch,则表示合并分支并作为一次提交,以记录分支信息,--no-ff参数表示禁用Fast forward模式。
删除分支:
git branch -d some-branch
git branch -D some-branch 强行删除分支,不论是否为被合并后与否的分支
git push origin --delete some-branch 删除远程分支
保护现场,隐藏当前工作区:git stash, 便可做其他插入的修改任务(如临时修改文件或切换分支修改等),此后再git stash pop恢复原工作区,继续早前的开发工作。
另外,git stash list命令查看隐藏列表
查看远程分支: git remote /-v -vv
从远程仓库dev分支创建对应的本地dev分支:
git checkout -b dev origin/dev
若如果git pull时,提示no tracking information,则先建立origin/dev分支与本地的dev对应的链接关联关系
git branch --set-upstream-to=origin/dev dev 或git branch -u origin/dev dev
打标签Tag:
git tag v0.1.0 some-commit-id 对某次提交ID的当前分支打某标签。若未指定comitID则默认为HEAD。
推送标签到远程仓库:
git push origin v0.1.0
移除本地和远程标签:
git tag -d v0.1.0
git push origin :refs/tags/v0.1.0
移除文件:
rm some_file
git rm some_file
若仅移除提交缓存或本地仓库中对应的文件而仍保留本地工作目录文件,则:git rm --cached some_file
重命名文件:
git mv one_file new_file
覆盖提交上一次提交和提交信息:(一般用在重新提交文件或提交遗漏文件、修改提交信息)
一般因commit后需要增加或修改信息,则操作后,再执行git commit --amend,以取消替换旧的commit信息,一定要在提交审批代码之前操作,因其会覆盖掉之前的commit hash以及对应的信息
git commit --amend
第三部分 常规异常问题
git Unlink of file 异常:
git gc --auto
git repack -d -l
第四部分 其他
一些有用的Git资料:
Git官网:https://git-scm.com/
Git官网的外链接:https://git-scm.com/documentation/external-links
LearnGitBranching:http://learngitbranching.js.org/
TryGit:https://try.github.io/
Git教程 - 廖雪峰的官方网站:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000