git 版本控制常用命令 - 整理
说明
看了廖老师的 Git 教程,教程非常详细,学习的过程中整理出了,一些常用的 git 命令,这里做一个记录。
1. 集中式 vs 分布式
1. 集中式版本控制系统
集中式版本控制系统的版本库是集中存放在中央服务器的,工作的时候需要先从中央服务器中读取最新的版本,然后开始工作,工作完在推送给中央服务器,集中式的最大缺点就是必须联网才能工作,中央服务器出问题,就很难解决
2. 分布式版本控制系统
分布式版本控制系统没有中央服务器的概念,每个人的电脑上都是一个完整的版本库,但也需要一个充当中央服务器的电脑,方便数据交换,中央服务器换掉没有关系,从其他人的版本库中复制就可以了
2. 版本库
工作区:创建的能看到的目录,就是一个工作区,文件的创建修改都在这里完成
版本库:工作区中的隐藏目录 .git 就是当前的版本库,包括 暂存区与分支
暂存区:stage 需要提交的文件都会放大暂存区,然后,可以一次性的提交暂存区的修改到分支
分支: git 会自动创建 master 分支
更多内容查看
3. 命令
1. 创建目录,通过 git init
初始化仓库
mkdir test
git init
2. 添加文件到版本库,直接在 test
当前文件夹下,编写文件并保存,然后执行命令
# 把指定文件添加到版本库中的暂存区(stage),可以反复多次使用
git add index.html
# 全部文件添加到版本库
git add .
3. 文件从暂存区提交到版本库中的分支,添加版本的提交说明
# -m 后是提交说明,可以是任意内容,文件从暂存区提交到版本库中的分支
git commit -m 'xxx'
4. 显示仓库的当前状态,(修改情况)
git status
5. 查看修改的内容
git diff
6. 查看历史修改记录
# 一般输出,内容多
git log
# 输出简化单行版
git log --pretty=oneline
7. 退回到上一个版本
# HEAD 表示当前版本 HEAD^ 表示上一个版本 HEAD^^ 上两个版本
git reset --hard HEAD^
# 94f41241d 表示要回退的 commit id 前几位
git reset --hard 94f41241d
8. 显示git 记录的每一次的命令
git reflog
9. 丢弃掉工作区的修改
# file 需要取消更改的文件名
git checkout -- file
10. 将提交到暂存区的修改回退到工作区
# file 需要取消更改的文件名
git reset HEAD file
11. 关联一个远程仓库
git remote add origin git@github.com:mjzhang1993/gitcontroltest.git
12. 将版本库master 分支中的内容推送给远程仓库
# -u 用作初次推送的时候,将本地分支与远程分支关联起来
git push -u origin master
13. 从远程仓库克隆
# -u 用作初次推送的时候,将本地分支与远程分支关联起来
git clone git@github.com:mjzhang1993/gitcontroltest.git
14. 创建分支
# 创建分支 dev
git branch dev
# 列出所有分支,查看当前分支
git branch
# 查看远程分支
git branch -a
# 重命名本地分支
git branch -m dev devs
15. 切换分支
# 切换分支
git checkout dev
# 创建并且切换分支
git checkout -b test
16. 合并指定分支到当前分支
# 切换到 master 主分支
git checkout master
# 合并 dev 分支到 master 主分支
git merge dev
17. 删除分支
# 删除本地分支
git branch -d dev
# 删除远程分支
git push origin --delete dev
18. 分支合并冲突
当要合并的两个分支都有不一样的修改, 通过
git merge
git 无法快速合并
# dev 分支修改文件
git checkout dev
# 查看修改的文件
git status
# dev分支修改提交
git add .
git commit -m 'dev change'
# 切换到 master 分支修改文件
git checkout master
# 查看修改的文件
git status
# master 分支修改提交
git add .
git commit -m 'master change'
# 在 master 分支中合并 dev 分支,产生冲突
git merge dev
# 查看冲突文件位置
git status
# 文件冲突位置 手动修改文件,确定最终输出版本,再提交一次
git add .
git commit -m 'master and dev change'
# 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
19. BUG 分支,以及储藏工作现场
# 在dev分支工作,并修改文件,修改后不添加到版本库
git checkout dev
# 存储工作现场
git stash
# 查看现在的工作区,干净的
git status
# 创建分支修复BUG
git checkout master
git checkout -b issue-001
# 在BUG 分支修改后提交
git add .
git commit -m 'xxx'
# 切换到 master 分支 并合并
git checkout master
git merge --no-ff -m "merged" issue-001
# 删除 临时处理BUG 的分支
git branch -d issue-001
# 返回 dev 分支继续工作
git checkout dev
# 查看存储的工作现场
git stash list
# 恢复上一个工作现场,并删除记录
git stash pop
# 恢复到指定的工作现场 stash@{0} 通过 git satsh list 查看
git stash apply --stash@{0}
# 删除 stash 记录
git stash drop --stash@{1}
20. 查看远程仓库的信息
# 查看远程分支
git remote
# 查看详细信息
git remote -v
21. 推送分支
# dev 是要推送的分支名
git push origin dev
22. 多人协作
# 一个成员加入,从远程克隆项目
git clone git@github.com:mjzhang1993/gitcontroltest.git
# 查看克隆后的分支,只能看到 master 的
git branch
# 使用远程的dev 分支开发,创建远程的dev分支到本地
git checkout -b dev origin/dev
# 修改 dev 分支 提交到版本库
git add .
git commit -m 'xxx'
# 提交到远程
git push origin dev
# 另一个成员同样更改了 dev 并提交,且两次提交内容有冲突
git add.
git commit -m 'other'
git push origin dev # 报错
# 把最新的提交从远程仓库抓下来
git pull
# 如果失败 no tracking information,原因是,本地dev 分支与远程origin/dev 分支没有连接,需要设置链接
git branch --set-upstream dev origin/dev # 显示 --set-upstream 将被弃用
git branch --set-upstream-to=origin/dev # git version 2.3.8 (Apple Git-58)
# 再次执行抓取
git pull
# 合并冲突后,再次提交
git add .
git commit -m 'xxx'
git push origin dev
23. 标签
tag 标签是版本库的一个快照,与 commit 比,他是一个有意义的名字
# 切换大需要打标签的分支
git checkout master
# 在最新的提交上打上标签
git tag v0.0.1
# 查看标签
git tag
# 找到历史提交的commit id
git log --pretty=oneline --abbrev-commit
# 给历史的commit 打标签
git tag v0.0.0 6d66b5d
# 查看标签信息
git show v0.0.0
# 创建带有说明的标签 -a 指定标签名 -m 指定说明文字
git tag -a v0.0.2 -m 'version 0.0.2' a200582
# 删除标签
git tag -d v0.0.0
# 推送某个标签到远程
git push origin v0.0.1
# 推送全部未推送到远程的本地标签
git push origin --tags
# 删除已推送到远程的标签
# 先删除本地的标签
git tag -d v0.0.1
# 再删除远程的标签
git push origin :refs/tags/v0.0.1
24. 忽略文件
在git 的工作区根目录创建
.gitignore
文件,把要忽略的文件名添加进去,git 就会自动忽略这些文件
.idea/
/node_modules/
强制添加或略类型的文件
git add -f App.class