Git使用
- 一、安装git
- 二、配置git及生成公钥
- 三、归档处导入公钥
- 四、项目中常用操作
- 4.1 准备操作
- 4.2 修改提交代码
- 4.3 解决冲突
- 4.4 remote仓库配置
- 4.5 回退
- 4.6 谨慎操作
- 五、后续归档处操作
- 5.1 issue
- 5.2 Merger Request
- 5.3 同步远程私人仓库和远程主仓库
- 5.4 临时修改代码
- 六、rebase
视频教材
参考教材
更详细的命令篇可以查看我的另一篇博客
一、安装git
git是一个命令行工具,当前的最新版本是Git-1.9.5-preview20141217.exe。安装过程很简单,一路默认next既可。
二、配置git及生成公钥
在git-bash
中进行如下操作:
# 编辑用户名、邮箱
git config --global user.name "yourname"
git config --global user.email "youremail@xxx.com"
# 查看当前的用户名、邮箱
git config user.name
git config user.email
git config -l
# 生成SSH Key,SSH Key文件保存地址默认既可。直接回车可以跳过设置密码
ssh-keygen -t rsa -C "your_email@xxx.com"
出现如下提示,表示创建SSH Key成功。其中,id_rsa是私钥文件,请妥善保管;id_rsa.pub是公钥,归档处需要设置。
三、归档处导入公钥
在归档处的SSH页面,导入之前生成的公钥id_rsa.pub
里的内容,建立信任。
若安装git图形界面(如TortoiseGit-2.4.0.2-64bit),在network中设置SSH Client为git安装目录的/usr/bin/ssh.exe
,diff viwer也可以修改为常用的查看文件差异的软件(如Beyond Compared)。
四、项目中常用操作
参考文档
- 图形界面操作: 在"git clone"弹出窗口,输入仓库地址,如果使用的是SSH方式clone,那么在"load putty key"中需要指定之前生成的putty私钥。
- 基本概念: 工作拷贝(工作目录):用于存放产品开发数据本地工作目录。 索引(Index):用于存放待提交数据的缓存区。 本地库:远端库的一个完整的拷贝,包括所有文件的修改记录,分支等。 远端库:本地库clone来源。 中心库:远端库的一种,公司级存放某个项目所有产品数据的仓库。 快照(snapshot):版本库某个时间点所有文件集合。 全球版本号(commitID):Git库的版本号是通过SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了。
4.1 准备操作
代码语言:javascript复制# --克隆git仓库
git clone ${url.git}
git clone -b ${branch-name} ${url.git}
git init
git config --global user.name "${username}"
git config --global user.email "${useremail}"
git config --global color.ui true
# --删除 untracked 的文件
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,强烈建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删,该语法不执行 clean 操作
git clean -nxfd
git clean -nf
git clean -nfd
# --创建分支
git branch ${branch-name}
# master是当前分支:
git checkout -b ${branch-name}
# master不是当前分支:
git checkout -b ${branch-name}master
# 修改分支名
git branch -m ${old-branch} ${new-branch}
# --删除分支
# 删除fork上的分支,以及本地对应的remote/${branch-name}分支
git push origin :${branch-name}
# 删除本地的分支
git branch -d ${branch-name}
4.2 修改提交代码
代码语言:javascript复制# --查看当前修改状态,-s表示以缩写的形式查看
git status
# --添加文件
# 添加一个指定文件
git add ${file-name}
# 添加全部修改的文件,无删除文件
git add .
# 添加全部修改的文件,有删除文件
git add --all
# 添加已忽略文件
git add -f ${file/path}
# --提交文件
# 指定提交信息并提交,-am可以合并add
git commit -m ""
# 弹出vim,在其中添加提交信息
git commit
# 覆盖最新一次的提交
git commit --amend
# --将已经提交到暂存区的某个文件取消提交操作
git reset ${file-name}
# 重命名或者移动本地文件或目录,需commit
git mv ${old-file-name} ${new-file-name}
merge参考资料
4.3 解决冲突
代码语言:javascript复制# 使用 git stash save "test-cmd-stash" 添加说明
$ git stash
$ git pull
# 使用 git stash apply 拉回 stash,并且不删除 stash 信息,pop 会删除
$ git stash pop stash@{0}
# CONFLICT (content): Merge conflict in xxx.xxx
# 解决文件中的冲突即可
4.4 remote仓库配置
代码语言:javascript复制# --远程仓库配置
git remote add origin ${remote-website.git}
git branch --set-upstream-to=origin/dev dev # 将远程分支dev和本地分支dev关联
git remote rm origin # 删除名为origin的远程仓库
# --提交/拉取
git pull origin master
git push origin dev:master
# pull操作相当于
git fetch origin master
git merge ${FETCH_HEAD} # 合并到当前所在的分支中
# 根据返回的FETCH_HEAD,查看刚取回的更新信息
git log -p {FETCH_HEAD}
# --remote仓库
# 显示所有的remote仓库
git remote show
# 查看某一个remote仓库信息
git remote show origin
建议使用git-stash命令将这些未commit文件暂存起来,并在解决冲突以后使用git stash pop把这些未commit文件还原出来。
4.5 回退
reset
**的参数:**
–mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
–soft
不删除工作空间改动代码,撤销commit,不撤销git add .
–hard
删除工作空间改动代码,撤销commit,撤销git add 。注意完成这个操作后,就恢复到了上一次的commit状态。
代码语言:javascript复制# 回退到修改前的版本 / 回退到add之后,新修改之前
git checkout -- ${file}
# 回退到add之前的版本,但不修改内容,需要有提交版本
git reset HEAD ${file}
# 回退到指定的commit版本
git log
git reset --hard ${commit-id}
# 使用:进行修改并add,然后修改最近一次提交说明,会将git链指向新的提交,但是前一次的提交仍存在(需要记得commit id)
# 只修改最近一次提交说明,会打开一个vim,在这之前也可以添加删除
git commit --amend
# 修改多个历史提交,慎用
git rebase -i HEAD~${n}
4.6 谨慎操作
代码语言:javascript复制# 清除本地未被跟踪的所有文件
git clean -f
五、后续归档处操作
5.1 issue
基于issue
的开发,可以将issue理解为一个TODO List。issue提交之后,若被接受,需分配到相应的责任人,该issue依次进入coding、testing、verified、closed或者rejected状态。
5.2 Merger Request
提交一个MR,选择相应的项目和分支,需要注意二者之间的冲突。pull远程代码,修改merge conflict文件,保存提交并推送,线上重新发启MR即可。
变更issue状态(改为coding),并附上MR地址
5.3 同步远程私人仓库和远程主仓库
当主库(源项目)更新后,fork库并不会一起更新,需要自己手动去更新。
代码语言:javascript复制# 将远程主库site2同步到远程fork库的site1上
git clone ${git code site1}
git remote -v
git remote add ${remote repository name} ${git code site2}
git pull ${git code site2} master
git push ${git code site1} master
# 提交到远程仓库的某个分支
git pull ${remote repository name} ${remote branch name}:${local branch name}
git push ${git code site1} ${local branch name}:${branch-name}
# 例如先将远程仓库config_base的release分支的代码拉取到本地dev分支,修改后再将dev分支的代码提交到bugfix分支
git pull config_base release:dev
git push config_base dev:bugfix
5.4 临时修改代码
代码语言:javascript复制git stash //暂存代码
git stash list //查看暂存区的所有暂存修改
git stash apply stash@{X} //取出相应的暂存,X为序号
git stash drop stash@{X} //将记录列表中取出的对应暂存记录删除
六、rebase
使用git pull命令的时候,可以使用–rebase参数,即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。
代码语言:javascript复制$ git pull --rebase <远程主机名> <远程分支名>