内容大部分来自于廖雪峰老师的Git教程,部分个人使用总结。
创建版本库
- 初始化一个Git仓库,使用
git init
命令 - 添加文件到Git仓库,分两步:
- 将文件从工作区添加至暂存区,使用
git add <file_path>
添加文件,多个文件名用空格隔开 - 将文件从暂存区提交至版本库,使用
git commit -m "<message>"
,<message>为这次提交说明 - 以发送邮件为例,理解概念,工作区:写邮件,暂存区:保存草稿箱,提交版本库:发送邮件
- 将文件从工作区添加至暂存区,使用
- HEAD指向当前分支的最近一次提交
时光穿梭机
- 掌握工作区状态,使用
git status
命令 - 如果
git status
告诉你有文件被修改过,使用git diff
命令,查看修改内容-
git diff
比较的是工作区和暂存区的差别 -
git diff --cached
比较的是暂存区和版本库的差别 -
git diff HEAD
可以查看工作区和版本库的差别
-
-
HEAD
指向的版本就是当前版本,因此Git允许我们在版本的历史之间穿梭,使用命令git reset --hard <commit_id>
- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本 - 若要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本
撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- <file_path>
- 场景2:当你改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步
- 第一步用命令
git reset HEAD <file_path>
,就回到了场景1 - 第二步按场景1操作。
- 第一步用命令
- 场景3:当你需要回滚版本库的某一次提交,分两种情况
- 第一种:commit,使用命令
git revert 【commitID】
- 第二种:merge,使用命令
git revert 【commitID】 --mainline=1
,参数--mainline
就是指定要撤销的那个提价,从左往右,从1开始
- 第一种:commit,使用命令
- 场景4:当你需要回滚到版本库的某一次提交
-
git reset -–hard <commit_id>
,彻底回退到某个版本的提交。时光穿梭机中的git reflog
可以帮助过去的你回到未来哦。
-
删除文件
- 使用命令
git rm <file_path>
,删除暂存区或版本库一个文件,文件在硬盘上也会被删除 - 使用命令
git rm --cached <file_path>
,删除暂存区或分支上的文件,文件在硬盘上不会被删除,只是不再被版本控制
远程仓库
- 配置SSH Key
- cd ~/.ssh
- $ ssh-keygen -t rsa -C "youremail@example.com"
- 如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
分支管理
- 查看分支,使用命令
git branch
- 创建分支,使用命令
git branch <name>
- 切换分支,使用命令
git checkout <name>
- 创建+切换分支,使用命令
git checkout -b <name>
- 合并某分支到当前分支,使用命令
git merge <name>
- 删除分支,使用命令
git branch -d <name>
- 删除未合并分支(强行删除),
git branch -D <name>
代码合并与解决冲突
-
代码合并分两步
-
git log --graph
命令可以看到分支合并图 -
git merge <name>
,合并<name>分支至当前分支
-
-
解决冲突
-
git mergetool
,调用一个可视化的合并工具并引导你解决所有冲突 -
git add
,视为冲突已解决 -
git commit -m "<message>"
,提交解决冲突代码
-
-
管理策略
- 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。而默认
--ff
(fast forward)合并就看不出来曾经做过合并 - 例:git merge --no-ff -m "merge with no-ff" dev
- 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。而默认
暂存
-
git stash
把当前工作现场“储藏”起来,等以后恢复现场后继续工作 -
git stash list
查看暂存列表 -
git stash pop <name>
恢复暂存,并删除暂存 -
git apply <name>
恢复暂存 -
git drop <name>
删除暂存
多人协作
- 查看远程库信息,使用
git remote -v
,本地新建的分支如果不推送到远程,对其他人就是不可见的-
--verbose
列出详细信息,在每一个名字后面列出其远程url
-
- 从本地推送分支,使用
git push origin <branch-name>
,如果推送失败,先用git pull
抓取远程的新提交 - 在本地创建和远程分支对应的分支,使用
git checkout -b <branch-name> <origin/branch-name>
,本地和远程分支的名称最好一致 - 建立本地分支和远程分支的关联,使用
git branch --set-upstream <branch-name> <origin/branch-name>
- 从远程抓取分支,使用
git pull
(= git fetch + git merge),如果有冲突,要先处理冲突
rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
- 只对尚未推送或分享给别人的本地修改执行变基操作清理历史
- 从不对已推送至别处的提交执行变基操作
tag标签管理
- 创建标签
-
git tag <tagname>
,用于新建一个标签,默认为HEAD,也可以指定一个commit id -
git tag -a <tagname> -m "blablabla..."
,可以指定标签信息 -
git tag
,可以查看所有标签。 - 步骤
- 切换到需要打标签的分支上
- 使用命令
git tag <name>
,就可以打一个新标签 - 使用命令
git tag
,查看所有标签 - 使用用命令
git tag <tagName> <commitId>
,在执行提交记录打一个标签
- 注意,标签不是按时间顺序列出,而是按字母排序的。可以用
git show <tagname>
查看标签信息 - 创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a <tagname> -m "<comment>" <commitId>
- 注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签
-
- 操作标签
- 使用命令
git push origin <tagname>
可以推送一个本地标签; - 使用命令
git push origin --tags
可以推送全部未推送过的本地标签; - 使用命令
git tag -d <tagname>
可以删除一个本地标签; - 使用命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
- 使用命令
配置管理
- 查看Git所有配置:
git config --list
- 删除全局配置项:
git config --global --unset user.name
,同名配置多个删除会失败 - 编辑配置文件:
git config --global --edit
实用小贴士
- 当使用
git log
查看提交历史时,使用q
即可退出查看,上下键滚屏 - 当使用
commit
时,未指定说明,弹出默认的vim编辑器,使用:wq
保存并退出 - 内建的图形化 git:
gitk
- 彩色的 git 输出(全局配置):
git config --global color.ui true
- 显示历史记录时,每个提交的信息只显示一行(全局配置):
git config --global format.pretty oneline
- 交互式添加文件到暂存区:
git add -i
- 给
git log
起别名,配置查看属性:git config --global alias.lg 'log --color --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit'
- 不删除文件的情况下使文件脱离版本控制:
git rm -r --cached <文件名>