Git入门

基本操作

打开 GIt Bash,先创建一个空目录。

Git入门_第1张图片

新建仓库

git init 在当前目录初始化一个全新的 Git 仓库。
git clone [url] 克隆一个远程仓库。

2

仓库可以理解成一个目录,该目录下的所有文件都会给 Git 管理。

该目录下生成的 .git 目录是 git 用来跟踪管理仓库的,不要修改。

Git只能记录文本文件的改动,对于视频、图片等二进制文件只能记录文件大小的改变。

添加文件

git add 文件名 添加指定文件到暂存区。
git add . 添加所有修改文件到暂存区
git commit -m "提交说明信息" 把暂存区的文件提交到仓库。其中 -m 后面的字符串是对于本次提交的说明。

Git入门_第2张图片
工作区:正在编写代码的地方。
暂存区:临时存放已经修改好的代码。
仓库:保存了所有所有内容的修改记录(版本)。

  1. 在仓库目录下,新建一个 readme.txt 文件
Git is a version control system.

Git is free software.
  1. 把文件添加到暂存区
    3

  2. 从暂存区提交到当前分支
    4

版本管理

git status 查看工作区当前状态

Git入门_第3张图片

提交日志

git log 查看提交日志(由近到远),其中 commit 后面的是版本号。

Git入门_第4张图片

git log --pretty=online 把提交日志压缩为一行

9

git reflog 查看所有 HEAD 引用的修改历史记录。

Git入门_第5张图片

版本回退

git reset --hard 版本号|HEAD^ 跳到指定版本

  1. 回退到上个版本(HEAD^表示上个版本 HEAD^^表示上上个版本 或者HEAD~100表示往上100个版本)。
    11

  2. 回退到指定版本(输入版本号全部或前缀)。
    12

  3. 取消回退:假设现在版本线是 A–>B–>C。版本C回退到版本A了,但是发现又想回去到版本C。但是忘记了版本C的版本号,可以通过git reflog查看。

撤销修改

git restore 文件名 撤销工作区的修改

Git入门_第6张图片

git reset HEAD readme.txt 撤销暂存区的修改。具体应该为当前分支的文件覆盖了暂存区的文件。

Git入门_第7张图片

删除文件

当你在工作区删了一个文件,但是这个时候工作区和版本库没有同步
Git入门_第8张图片

  1. 确定是要删除该文件(即删除版本库中相关文件)
    Git入门_第9张图片

  2. 删错了(恢复工作区相关文件)
    17

分支管理

Git入门_第10张图片
分支:每次提交,git都会把他们串成一条时间线,这条时间线就是分支。
master指针指向该分支的最新提交,HEAD指向当前使用中分支。

git branch 分支名 新建一个分支
git checkout 分支名 切换分支
git merge 目标分支 把当前分支和目标分支合并。
git branch -d 分支名 删除分支,没有合并的分支不能使用该方法删除。
git branch -D 分支名 强行删除分支,可以删除未合并分支。

  • 当新建分支时,假设叫dev,git就会新建一个dev指针指向master相同提交。切换分支时,即把HEAD指向需切换到的分支dev
    Git入门_第11张图片

Git入门_第12张图片

  • 现在如果有新的提交就会在当前分支dev上。而master分支不变。
    Git入门_第13张图片

修改readme.txt内容并提交
Git入门_第14张图片

切换到master分支查看内容并没有改变
Git入门_第15张图片

  • 如果现在要合并这两个分支,先切到master分支,在把master指针指向dev所指。
    Git入门_第16张图片

合并分支后,再查看master分支内容变
Git入门_第17张图片

  • 合并完成后可以删除dev分支(指针)
    Git入门_第18张图片

Git入门_第19张图片

解决冲突

  • 情景模拟
    Git入门_第20张图片

  • 假设有两个分支一开始指向同一个提交,然后两个分支都对同一个文件进行了不同的修改。且都经过add,commit提交到了仓库。当合并两个仓库时,会出现冲突
    Git入门_第21张图片

  • 解决办法
    只能手动把其中的一个分支对文件的修改和另一个分支进行同样的修改后,重新add,commit到仓库,方可解决。
    Git入门_第22张图片

合并之后
Git入门_第23张图片

合并策略

当目标分支(通常是主分支)和要合并的分支之间的提交历史是线性的、无分叉的时候,Git 会默认使用 Fast forward 模式,在该情况下,删除分支后,就不会再记录该分支的信息,彷佛没有出现过。

git merge --no-ff -m "提交信息" 分支名使用该命令可以在合并时不使用Fast Forward模式
git merge --ff-only 分支 强制使用快进模式,如果不能执行,合并失败。

// 下面的dev/test分支是使用快进模式合并的,dev/test2使用的普通模式合并的。
$ git log --graph --pretty=oneline --abbrev-commit
*   4f3170d (HEAD -> master) merge dev/test2
|\
| * 6b15ecf (dev/test2) test2 update readme.txt
|/
* fe9bcf9 (dev/test) readme.txt add 444444
* d0f0351 add a readme.txt

// 当删除两个分支后如下,可以看出快进模式不会记录分支的信息。
$ git log --graph --pretty=oneline --abbrev-commit
*   4f3170d (HEAD -> master) merge dev/test2
|\
| * 6b15ecf test2 update readme.txt
|/
* fe9bcf9 readme.txt add 444444
* d0f0351 add a readme.txt

Bug分支

git stash 保存现场。
git stash list查看保存列表。
git stash apply 现场标识 恢复现场,但没有从列表中删除。
git stash pop 从列表恢复最近现场同时在列表删除它。
git cherry-pick 版本号复制特定提交到当前分支。

当正在开发一个功能时,可能要修复一个bug,但是现在的任务没有完成不能提交。
我们可以使用git stash进行保存,然后修复完bug切回当前分支,使用git stash pop恢复现场同时删除该现场的存档。
使用git cherry-pick 版本号把bug提交的复制到当前分支。

多人协作

git fetch 拉取远程仓库的最新,但不会合并。
git pull 相当于fetch和merge的结合,拉取最新并合并。
remote:远程仓库,一般为origin;branch:远程分支。
git branch --set-upstream-to origin/本地分支和远程分支建立链接关系。[可选]

当队友在dev的分支上提交了他已完成的功能,可以使用git pull拉取下来合并,当然这中间可能遇到冲突,需要自己手动解决。

Rebase

git rebase会整理当前分支的提交为一条直线。最终的结果是一致的,但是之前commit的提示信息会变。

标签

git tag 给某次提交打上标签,未指明提交时默认为当前分支最新提交。
git tag 查看已有标签
git tag 查看标签详情
git tag -d 删除标签

你可能感兴趣的:(Git,git)