目录
1.基础使用
工作目录(普通文件),暂存区(stage-index),git仓库(.git-HEAD),远程库(origin)
全局设置(--global对本地所有仓库生效):
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
使用流程:
git clone “代码仓库地址” 下载代码,
用git fetch origin或者git pull来更新内容,
git pull = git fetch + git merge
修改文件用git add暂存修改,
用git status显示修改和暂存了哪些文件,
改好之后用git commit -m ‘’ 提交记录到git仓库,
最后用git push origin master提交到服务器上,
可以把 master 换成任何分支。
2.撤销
撤销stage流程:
查看提交记录用git log , 参数 --pretty=oneline精简显示。
用 git reset 撤销所有暂存区域文件。
或用git reset file 来撤销特定的文件。
注意reset不会覆盖工作目录文件。
撤销工作目录修改流程:
使用 git checkout file用暂存区内容覆盖掉工作目录的文件内容。没有加入暂存区则用Git仓库最近一次提交版本。如果直接用最新的git仓库文件同时覆盖掉暂存区和工作目录内容可以使用git checout HEAD -- files
撤销commit流程:
git reset --soft HEAD~n撤销最后n次 commit 并且保留工作目录改动的内容。
git reset --hard HEAD~n撤销最后n次 commit 并且覆盖工作目录改动的内容。
撤销commit之后想要恢复最新版本,用git reflog 可以获取到所有的版本号,再用git reset --hard 版本号。
3.分支
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支master上。
HEAD指向的是当前分支,每个分支都指向其最后的提交。
分支操作:
使用git checkout –b fenzhi 创建并切换分支,
用git branch 查看所有的分支,当前分支前会有星号,作出修改后对于其他分支的文件不会产生影响,
可以用git checkout fenzhi 切换到另一个分支,
然后用git merge -no-ff -m “注释” fenzhi 合并fenzhi到当前分支上,当两个分支上出现不同修改时产生冲突,
用git status查看未合并的文件,
使用git stash保存当前工作现场,
使用git pull更新git库,
打开文件查看差异并修改,
解决冲突之后git add标记为解决成功,
再重新git merge即可,
使用git stash pop恢复状态。
使用git checkout -d fenzhi 删除分支。
使用 git merge –no-ff -m “注释” fenzhi 进行合并则会在当前分支中保存fenzhi的信息。
使用git rebase -i HEAD~n,或者git rebase -i 版本号1 版本号2,可以合并多个提交为一个提交,其中n为要合并的最后提交的几个分支,版本号则为前开后闭区间,只提供版本号1则合并其后的所有提交。
需要将某一个分支中的一段提交同时应用到其他分支中时:
如果只是复制某一两个提交到其他分支应使用git cherry-pick 版本号,
多个分支时使用 git rebase 版本号1 版本号2 --onto fenzhi (注意区间为前开后闭)
合并后修改分支指向最后的提交:git checkout fenzhi,git reset --hard 版本号2
4.repo
repo通过一个git库manifests来管理项目的清单文件。
仓库目录(修改记录),工作目录(当前版本)。
一般来说,一个项目的Git仓库目录(默认为.git目录)是位于工作目录下面的,但是Git支持将一个项目的Git仓库目录和工作目录分开来存放。
manifests: 仓库目录有两份拷贝,一份位于工作目录(.repo/manifests)的.git目录下,另一份独立存放于.repo/manifests.git
repo:仓库目录位于工作目录(.repo/repo)的.git目录下
project:所有被管理git库的仓库目录都是分开存放的,位于.repo/projects目录下。同时,也会保留工作目录的.git,但里面所有的文件都是到.repo的链接。这样,即做到了分开存放,也兼容了在工作目录下的所有git命令。
既然.repo目录下保存了项目的所有信息,所有要拷贝一个项目时,只是需要拷贝这个目录就可以了。repo支持从本地已有的.repo中恢复原有的项目。
使用流程:
repo init初始化工程,指定待下载的分支
repo sync下载代码 -j 参数指明线程数
repo start将本地git库切换到开发分支(TOPIC BRANCH
repo forall -c “git 指令”如果针对每个git库的操作命令都是相同的,可以一次性完成所有操作,多条命令只需要用“;”间隔
5.patch
有时一个修改只想同步给协同开发的某几个人, 使用patch比push更加符合用户体验
为了保护master,一般情况下会建立一个专门处理新交来的patch的分支
推荐使用git的format-patch和am命令,用此方法获得的patch是commit里提交的code修改以及commit信息。
生成:
git format-patch –n commit_id
-n表示将这条commit及之前的多少条上传做成patch,如果只要这条commit_id,则n为1
合入:
git apply --stat mypatch.patch 查看patch的情况
git apply --check mypatch.patch 检查patch是否能够打上,没有任何输出则说明无冲突
git am mypatch.patch 全信息合入,无需额外commit,author也是patch的author而不是打patch的人
git apply mypatch.patch 无信息合入,打完patch后需要重新add和commit
错误处理:
用命令git apply --reject <patch_name>强行打这个patch,发生冲突的部分会保存为.rej文件,
根据.rej文件编辑发生冲突的文件以解决冲突,
将该patch涉及到的所有文件(不仅仅是发生冲突的文件)git add,
git am --resolved继续打patch。
如果不想打这一系列patch了,直接git am --abort。
6.杂项
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,可以使用如下命令添加:git remote add origin <server>
要查看远程库的详细信息 使用 git remote –v
查看文件修改内容:git diff (filename)
查看已经add的文件修改内容:git diff --cached (filename)
要修改之前的commit内容,可以使用以下命令
git commit --amend