文章目录
创建版本库
命令 | 说明 |
---|---|
git init | 创建版本库 |
全局参数设置
命令 | 说明 | 示例 |
---|---|---|
git config --global | 全局参数设置 | git config --global user.name “PesenX” |
常见用法:
设置姓名:git config --global user.name "PesenX"
设置邮箱:git config --global user.email "test@foxmail.com"
Git diff ^M消除:git config --global core.whitespace cr-at-eol
提交修改
命令 | 说明 | 示例 |
---|---|---|
git add | 把文件修改添加到暂存区 | git add readme.txt |
git rm | 把文件修改从暂存区移除 | git rm test.txt |
git commit | 把暂存区的所有内容提交到当前分支 | git commit -m “wrote a readme file” |
工作区和暂存区
工作区为工作目录,工作区有一个隐藏目录.git,是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
查看修改状态
命令 | 说明 | 示例 |
---|---|---|
git status | 查看工作区的状态,可以查看哪些文件被修改过 | git status |
git diff | 查看工作区和版本库里面最新版本的区别 | git diff HEAD – readme.txt |
常见用法:
git diff branch1 branch2 --stat //显示 branch2 相对 branch1 的所有有差异的文件列表
git diff branch1 branch2 文件名(带路径) //显示 branch2 相对 branch1 的指定文件的详细差异
git diff branch1 branch2 //显示 branch2 相对 branch1 的所有有差异的文件的详细差异
版本回退
Git允许我们在版本的历史之间穿梭,穿梭前,用git log可以查看提交历史,以便确定要回退(使用命令git reset --hard commit_id 或者 git revert commit_id)到哪个版本。要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
命令 | 说明 | 示例 |
---|---|---|
git log | 显示从最近到最远的提交日志 | git log --pretty=oneline |
git reset | 回退到指定版本 | git reset --hard HEAD^; git reset --hard 3628164 |
git revert | git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 | git revert HEAD 撤销前一次 commit; git revert HEAD^ 撤销前前一次 commit; git revert commit_id 撤销指定的版本,撤销也会作为一次提交进行保存。 |
git reflog | 查看当前分支的操作记录 | git reflog |
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
- git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
HEAD
HEAD指向的版本就是当前版本,使用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区 。
撤销修改
命令 | 说明 | 示例 |
---|---|---|
git checkout | 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 | git checkout – file |
git checkout – readme.txt意思就是把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。
用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
使用场景
场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
远程仓库
添加远程仓库
命令 | 说明 | 示例 |
---|---|---|
git remote add origin git@xxx.git | 关联一个远程库 | git remote add origin git@server-name:path/repo-name.git |
git push | 将修改提交到远程仓库 | git push -u origin master |
关联远程仓库后,第一次推送master分支的所有内容要使用命令git push -u origin master命令,之后推送可以省略“-u”参数:git push origin master;
示例
cd existing_folder
git init
git remote add origin git@gitlab.tuling123.com:bigmarket/turing-tools.git
git add .
git commit
git push -u origin master
从远程仓库克隆
命令 | 说明 | 示例 |
---|---|---|
git clone | 从远程仓库克隆 | git clone git@xxx.git |
######示例
cd existing_folder
touch README.md
git add README.md
git commit -m “add README”
git push -u origin master
git clone [ib branch] @giturl
分支管理
分支操作
命令 | 说明 | 示例 |
---|---|---|
git branch | 查看分支 | git branch |
git branch bname | 创建分支 | git branch dev |
git checkout bname | 切换分支 | git checkout dev |
git checkout -b bname | 创建并切换分支 | git checkout -b dev |
git branch -d bname | 删除分支 | git branch -d dev |
git branch -D bname | 强制删除分支 | git branch -D dev |
git push [远程名] :[分支名] | 删除远程分支 | git push origin :serverfix |
git merge bname | 将远程分支的内容合并到当前分支 | git merge origin/serverfix |
git log --graph | 查看分支合并情况 | git log --graph --pretty=oneline --abbrev-commit |
切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致:git checkout -b serverfix origin/serverfix
git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。
因为创建、合并和删除分支非常快,所以Git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
现场管理
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
命令 | 说明 | 示例 |
---|---|---|
git stash | 保存现场 | git clone git@xxx.git |
git stash list | 查看现场 | git stash list |
git stash apply | 恢复现场,后,stash内容并不删除,需要用git stash drop来删除 | git stash list |
git stash pop | 查看现场,恢复的同时把stash内容也删了 | git stash list |
git stash clear | 清空所有现场 | git stash clear |
分支策略
分支类型 | 说明 |
---|---|
master分支 | master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。 |
bug分支 | 软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。 |
详见:https://blog.csdn.net/ifwinds/article/details/81673315
多人协作
命令 | 说明 | 示例 |
---|---|---|
git remote | 要查看远程库的信息。 | git remote |
git remote -v | 查看远程库,显示更详细的信息。 | git remote -v |
git push origin dev | 将修改推送到远程库的dev分支。 | git push origin dev |
git fetch | 同步远程仓库 | git fetch origin dev |
git pull | 同步远程仓库并合并,等同于git fetch + git merge | git pull origin dev |
git branch --set-upstream branch-name origin/branch-name | 关联本地分支与远程分支,如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,需要使用该命令创建。 | git branch --set-upstream dev origin/dev |
标签管理
命令 | 说明 | 示例 |
---|---|---|
git tag | 查看标签 | git tag |
git show tagname | 显示标签信息 | git show tagname |
git tag tagname | 打一个新标签 | git tag tagname |
git tag -d tagname | 删除本地标签 | git tag -d tagname |
git push origin :refs/tags/tagname | 删除远程标签 | git push origin :refs/tags/tagname |
git push origin tagname | 推送某个标签到远程 | git push origin tagname |
git push origin --tags | 一次性推送全部尚未推送到远程的本地标签 | git push origin --tags |
打标签步骤:1. 切换到需要打标签的分支上;2. 在分支上打标签
删除远程标签步骤:1. 先从本地删除;2. 从远程删除
Merge Request
详见:https://blog.csdn.net/ifwinds/article/details/81673315
常见问题
https模式git总让输入用户名及密码问题
只要是使用git操作,不管是同步,拉去,克隆,总是输入用户名及密码,是一件很繁琐的事情
解决方法:打开终端,cd到仓库位置,执行如下命令。
git config --global credential.helper store
原理是在 .gitconfig 文件中添加了 [credential] helper = store 配置,设置为记住密码(长期存储)。
更多命令:
命令 | 说明 |
---|---|
git config –global credential.helper store | 长期存储密码 |
git config –global credential.helper cache | 设置记住密码(默认15分钟) |
git config credential.helper ‘cache –timeout=3600’ | 设置密码一个小时之后失效 |
参考文献:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://blog.csdn.net/yourlin/article/details/48996001