这是一篇入门级使用指南,更多详细的请参考 Git 官网电子书。
在这里将列举一些常用命令和场景解决方案,欢迎大家补充学习。
在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:
- 代码被覆盖或丢失
- 代码写的不理想希望还原之前的版本
- 希望知道与之前版本的差别
- 是谁修改了代码以及为什么修改
- 发版时希望分成不同的版本(测试版、发行版等)
因此,我们希望有一种机制,能够帮助我们:
- 可以随时回滚到之前的版本
- 协同开发时不会覆盖别人的代码
- 留下修改记录,以便随时查看
- 发版时可以方便的管理不同的版本
一个标准的版本控制系统 Version Control System (VCS),通常需要有以下功能:
- 能够创建 Repository (仓库),用来保存代码
- 协同开发时方便将代码分发给团队成员
- 记录每次修改代码的内容、时间、原因等信息
- 能够创建 Branch (分支),可以根据不同的场景进行开发
- 能够创建 Tag (标签),建立项目里程碑
版本控制系统发展至今有几种不同的模式:
Local VCS
本地使用 复制/粘贴 的方式进行管理,缺点是无法协同开发
Centralized VCS (Lock,悲观锁)
中央集中式版本控制系统团队共用仓库,当某人需要编辑文件时,进行锁定,以免其他人同时编辑时造成冲突。缺点是虽然避免了冲突,但不是很方便。其他人需要排队才能编辑文件,如果有人编辑了很久或是忘记解锁就会造成其他人长时间等待的情况。
Centralized VCS (Merge,乐观锁)
中央集中式版本控制系统团队共用仓库,不采用悲观锁方式来避免冲突,而是事后发现如果别人也修改相同文件(冲突),再进行手动修改解决。有很多 VCS 属于这种类型,如:CVS,Subversion,Perforce 等
中央集中式版本控制系统的共同问题是,做任何操作都需要和服务器同步,如果服务器宕机则会造成无法继续工作的窘迫。
Distributed VCS
分布式版本控制系统,本地也拥有完整的代码仓库,就不会出现上述集中式管理的问题,即使没有网络,依然可以 commit 和看 log,也无需担心服务器同步问题。如:Git,Mercurial,Bazaar 等就属于分布式版本控制系统。缺点是功能比较复杂,上手需要一定的学习时间。
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
-
Git 官网下载地址:Git 版本管理工具
-
客户端推荐:SourceTree,软件安装跳过注册,请参考这里
一图胜千言
推荐一个不错的可视化工具:Git Cheat Sheet
设置提交者姓名
$ git config --global user.name "John Doe"设置提交者邮箱
$ git config --global user.email johndoe@example.com查看配置列表
$ git config --list在指定目录创建仓库,如果没有指定目录名将在当前目录创建仓库
$ git init [目录名]
# 当前文件夹初始化
$ git init .
# 指定目录
$ git init frank从指定地址克隆仓库,若不指定目录名将默认创建与远程同名目录
$ git clone <远程仓库地址> [目录名]
# 不想创建目录,目录名为 . ,直接加在内容到当前目录下
$ git clone https://github.com/frank-lam/2019_campus_apply.git .将文件或目录中已修改的代码添加追暂存区
$ git add <目录名|文件名>提交暂存区内容
$ git commit -m "<注释>"查看仓库状态
$ git status比对当前内容和暂存区内容
$ git diff比对当前内容和最近一次提交
$ git diff HEAD比对当前内容和倒数第二次提交
$ git diff HEAD^比对最近两次提交
$ git diff HEAD^ HEAD查看提交历史
$ git log --oneline打印为单行log
$ git log --oneline打印所有记录(忽略HEAD的位置)
$ git log --all打印示意图(忽略HEAD的位置)
$ git log --graph查看所有分支
$ git branch有分支:创建分支,无分支:列出所有分支
$ git branch [分支]切换至分支
$ git checkout <分支>创建并切换至分支分支
$ git checkout -b <分支>将分支与当前分支合并
$ git merge <分支>拉取远程仓库
$ git pull推送至远程仓库
$ git push <远程仓库> <分支>新增远程仓库 origin
$ git remote add origin https://xxx.git修改远程仓库 origin
$ git remote set-url origin https://xxx.gitGit提示:up-to-date,但未得到删除的文件
原因:当前本地库处于另一个分支中,需将本分支发 Head 重置至 master
$ git checkout master
$ git reset --hardgit 强行 pull 并覆盖本地文件
$ git fetch --all
$ git reset --hard origin/master
$ git pull应用场景:
- 当正在 dev 分支上开发某个项目,这时项目中出现一个 bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用 git stash 命令将修改的内容保存至堆栈区,然后顺利切换到 hotfix 分支进行 bug 修复,修复完成后,再次切回到 dev 分支,从堆栈中恢复刚刚保存的内容。
- 由于疏忽,本应该在 dev 分支开发的内容,却在 master 上进行了开发,需要重新切回到 dev 分支上进行开发,可以用 git stash 将内容保存至堆栈中,切回到 dev 分支后,再次恢复内容即可。
总的来说,git stash 命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash 中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash 作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
