一、常见命令
-
git init
: 初始化 git 仓库,即将一个文件夹初始化为一个 git 仓库。具体的操作是创建一个.git
隐藏文件夹 -
git status
: 查看仓库的状态 -
git add <file>
: 将文件提交到暂存区 -
git commit -m <代码提交信息>
: 将暂存区的文件提交到仓库中,并附带说明信息 -
git log
: 查看所有产生的 commit 记录 -
git config -l
: 查看自己的配置,默认配置都在.git/config
文件中
1.2 分支相关的命令
-
git branch <branch_name>
: 如果不加上<branch_name>
,查看当前分支情况。如果加上,就是创建一个分支。 -
git checkout <branch_name>
: 切换到<branch_name>
的分支上 -
git checkout -b <branch_name>
: 创建一个分支并切换到这个分支上,效果相当于合并上面 2 个命令。 -
git merge <branch_name>
: 将<branch_name>
分支合并到当前所在的分支上 -
git branch -d <branch_name>
: 将<branch_name>
分支删除 -
git branch -D <branch_name>
: 将<branch_name>
分支强制删除。如果<branch_name>
分支存在未合并的代码时,那么用-d
是删除不了。
1.3 标签相关的命令
-
git tag
: 查看历史 tag 记录。 -
git tag <tag_name> <commit_id>
: 在指定提交 id 上创建一个 tag。如果不写<commit_id>
,那就在最新的 commit 上创建一个 tag。 -
git checkout <tag_name>
: 切换到<tag_name>
标签 -
git show <tag_name>
: 查看标签信息 -
git tad -d <tag_name>
: 删除标签 -
git push origin <tag_name>
: 将某个标签推送到远程仓库 -
git push origin :refs/tags/<tag_name>
: 可以删除一个远程标签。
1.4 SSH
提前申明, windows 系统并不自带 SSH, 但是安装的 Git 中带有 SSH。所以以下命令请在 Git bash 下执行。
-
ssh-keygen -t rsa
: 指定 rsa 算法生成密钥。 -
ssh -T git@github.com
: 测试 ssh 是否成功添加到 github 中
1.5 Github 操作
-
git clone ...
: 将 github 项目复制到本地的当前目录 -
git push origin <本地分支>:<远程分支>
: 把本地分支中本地代码同步到远程分支 -
git pull orgin <branch_name>
: 把远程 <branch_name> 分支的最新的代码同步到本地当前分支中 -
get remote add origin git@github.com:xxx/xxxx.git
: 将当前本地仓库与远程进行联接 -
git remote -v
: 查看我们当前项目有哪些远程仓库
1.6 补充命令
-
alias 别名
-
git config --global alias.<别名> "<原命令>"
。比如git config --global alias.c "checkout"
,之后git c
==git checkout
-
-
diff
-
git diff
: 比较工作区文件和暂存区文件差异。如果加上文件名,就仅比较这个文件在工作区与暂存区的区别 -
git diff <commit_id1> <commit_id2>
: 比较两次提交之间的差异
-
-
checkout
- 作用 1 :切换分支、标签以及 commit。本质是「用某个 HEAD 中的最新内容替换掉你的工作区中的文件」。切换时,暂存区的内容不受影响但相当于在切换前执行了
git stash
- 作用 2 :撤销还没进入暂存区的修改的作用。举个例子,假设我们在一个分支开发一个小功能,刚写完一半,这时候需求变了,而且是大变化,之前写的代码完全用不了了,好在你刚写,甚至都没有 git add 进暂存区,这个时候很简单的一个操作就直接把原文件还原:
git checkout a.md
,本质上是将 HEAD 内容覆盖掉工作区的内容。注意,checkout 命令只能撤销还没有 add 进暂存区的文件。
- 作用 1 :切换分支、标签以及 commit。本质是「用某个 HEAD 中的最新内容替换掉你的工作区中的文件」。切换时,暂存区的内容不受影响但相当于在切换前执行了
-
stash
- 作用:把当前分支中的工作区的所有修改先暂存到栈上。
- 运用场景:假设我们正在一个新的分支做新的功能,这个时候突然有一个紧急的bug需要修复,而且修复完之后需要立即发布。当然你说我先把刚写的一点代码进行提交不就行了么?这样理论上当然是ok的,但是这会产品垃圾commit,原则上我们每次的commit都要有实际的意义,你的代码只是刚写了一半,还没有什么实际的意义是不建议就这样commit的,那么就用
git stash
保留。 -
git stash
: 把当前分支所有没有 commit 的代码先暂存起来 -
git stash list
: 查看所有 stash 记录 -
git stash apply
: 将暂存的代码还原 -
git stash drop
: 把最近一条 stash 记录删除。注意:每次还原代码后,最好删除这条 stash 记录 -
git stash pop
==git stash apply
+git stash drop
- 注意:执行了
git add
的数据在切换分支时,会自动暂存一起。本质上是因为切换分支不影响暂存区的数据。但需要手动恢复。
二、常用概念
2.1 工作区、暂存区与 HEAD
- 工作区就是你还没有执行
git add
的文件,它持有实际文件; - 暂存区就是你执行了
git add
但没执行git commit
的文件,它像个缓存区域,临时保存你的改动; - HEAD 就是你执行完
git commit
,它指向你最后一次提交的结果并且清空暂存区。
在实际中,工作区有一个隐藏目录 .git
,它不属于工作区,而是 Git 的版本库。Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index )的暂存区,还有 Git 为我们自动创建的第一个分支
master ,以及指向master的一个指针叫 HEAD。
与此同时,History 保存着所有分支信息,HEAD 指针指向当前分支。
上述命令有待验证。
2.2 分支 branch
stormzhang 从0开始学习 GitHub 系列之「团队合作利器 Branch」
2.3 标签 tag
本质:标签作用于提交上,可以看成是某个提交的别称。
运用:主要用于标记软件的版本号。
2.4 SSH
简单点说,SSH是一种网络协议,用于计算机之间的加密登录。目前是每一台 Linux 电脑的标准配置。而大多数 Git 服务器都会选择使用 SSH 公钥来进行授权,所以想要在 GitHub 提交代码的第一步就是要先添加 SSH key 配置。
命令生成的密钥会存放在两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是私钥,id_rsa.pub 就是公钥。这两文件默认分别在如下目录里生成:
Linux/Mac 系统 在 ~/.ssh
下,win系统在 /c/Documents and Settings/<username>/.ssh
下,都是隐藏文件,相信你有办法查看的。
接下来要做的是把 id_rsa.pub 的内容添加到 GitHub 上,这样你本地的 id_rsa 私钥跟 GitHub 上的 id_rsa.pub 公钥进行配对,授权成功才可以提交代码。
2.5 Github 操作
Push
如果你本地代码有更新,那么就需要把本地代码推到远程仓库,这样本地仓库跟远程仓库就可以保持同步了。
Pull
如果远程仓库有更新,那么需要把远程仓库的最新代码更新到本地,然后保证两端代码的同步。一般我们在 push 之前都会先 pull ,这样不容易冲突。
先有远程仓库,后有本地仓库:Clone
使用 git clone
命令,将远程仓库复制到本地中。然后,修改本地仓库并进行 git commit
。然后,git pull orgin <远程分支>
建立本地仓库和远程仓库之间联系以及保持同步。最后,git push origin <本地分支>:<远程分支>
将本地仓库的修改提交到远程仓库中
通过 git clone
命令复制的仓库,不需要使用 git init
初始化,同时也不需要声明与远程仓库关联(因为已经声明了)。
先有本地仓库,后有远程仓库:关联本地已有项目
如果我们本地已经有一个完整的 git 仓库,并且已经进行了很多次 commit ,我们想将本地仓库提交到 github 上。
假设本地仓库 test2,要提交到 github test 项目中,一般步骤是:
- 在 github 创建 test 项目
- 在 test2 目录中输入
git remote add origin git@github.com:xxxx/test.git
将本地 test2 项目与 github 的 test 项目关联起来 git push origin master
合并操作:merge & rebase
git merge branch_a
与 git rebase branch_a
的效果是一样,都是将 branch_a
分支合并到当前的分支中。但两者合并方式不同:rebase 跟 merge 的区别你们可以理解成有两个书架,你需要把两个书架的书整理到一起去,
- 第一种做法是 merge ,比较粗鲁暴力,就直接腾出一块地方把另一个书架的书全部放进去,虽然暴力,但是这种做法你可以知道哪些书是来自另一个书架的;
- 第二种做法就是 rebase ,他会把两个书架的书先进行比较,按照购书的时间来给他重新排序,然后重新放置好,这样做的好处就是合并之后的书架看起来很有逻辑,但是你很难清晰的知道哪些书来自哪个书架。
合并冲突
如果两个分支 a,b 同时修改了同一个位置时,合并到 master 时就会报冲突。不管两个分支合并的先后顺序、中间是否还合并了其他的分支(即任何情况下),都会报冲突。发生冲突的地方,Git 会在发生冲突的位置使用 <<<<< 、======、>>>>> 标记出不同分支的内容。如
<<<<<<< HEAD # HEAD 内容
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1 # feature1 分支的内容
此时,你需要手动地进行正确的合并后,再 git add .
与 git commit
就可以了。
2.6 Git 与 SVN 对比
Git 属于分布式版本控制系统,而 SVN 属于集中式。集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。