Featured image of post 两小时 Git 入门

两小时 Git 入门

两小时 Git 入门

两小时 Git 入门

建立 Git 仓库

1
$ git init

把文件添加到仓库

1
$ git add + filename

把文件提交到仓库

1
$ git commit -m "wrote a readme file"

查看提交结果/对比工作区和文件和仓库文件的不同之处

1
$ git status

比对并列出文件和仓库文件的不同之处

1
2
3
$ git diff

#如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

Git 查看历史记录

1
$ git log/git log --pretty=oneline(查看精简版)

退回曾经的某个版本

退回最新版

1
2
3
$ git reset --hard + (对应的append GPL的commit id)

$ git reset --hard HEAD^

用 HEAD 表示当前版本,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100

查找所有版本 append GPL 的 commit id

1
$ git reflog

Git 原理:

1.工作区(Working Directory)就是 Git 创建仓库所在的目录

2 版本库(Repository)工作区有一个隐藏目录。Git,这个不是工作区,而是 Git 的版本库 Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEADgit add 实际上就是把文件修改添加到暂存区 Git commit 实际上就是把暂存区的所有内容提交到当前分支我们创建 Git 版本库时,Git 自动为我们创建了唯一一个 master 分支,所以,现在,Git commit 就是往 master 分支上提交更改

查看工作区和版本库里面最新版本的区别

1
$ git diff HEAD -- +文件名

放弃对文件的更改

放弃对"工作区"文件的更改

1
2
3
$ git checkout -- 文件名

$ git checkout -- file

命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令

放弃对"暂存区"文件的更改

1
$ git reset HEAD + 文件名

场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 Git checkout – file。

场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 Git reset HEAD ,就回到了场景 1,第二步按场景 1 操作。

场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退 <number 7>,不过前提是没有推送到远程库。

命令 Git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

创建 GitHub 远程仓库

第 1 步:创建 SSH Key。在用户主目录下,看看有没有。SSH 目录,如果有,再看看这个目录下有没有 id_rsa,id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开 Shell(Windows 下打开 Git Bash),创建 SSH Key

1
$ ssh-keygen -t rsa -C"[email protected]"

第 2 步:登陆 GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意 Title,在 Key 文本框里粘贴 id_rsa.pub 文件的内容

第 3 步: 登陆 GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库,在 Repository name 填入仓库名,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的 Git 仓库

第 4 步: 在本地 shell 上 对 GitHub 上的仓库绑定: Git remote add frelon [email protected]:lixuanliming/frelon.git 这里的 frelon 是远程仓库的名字,后面是 GitHub 给的 URL11.推送更新到 GitHub 仓库上

1
$ git push -u 仓库名 master

#由于远程库是空的,我们第一次推送 master 分支时,加上了-u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后推送或者拉取时就不用加 -u 参数

1
$ git push 仓库名 master

关于远程仓库

从远程仓库克隆 如果自己需要新建一个项目,且从零开发,那么最好的方式是先创建远程库,然后,在 shell 里从远程库克隆

建仓库过程省略,在建立仓库的时候我们可以勾选 Initialize this repository with a README,这样 GitHub 会自动为我们创建一个 README.md 文件。创建完毕后,可以看到 README.md 文件

Clone 远程仓库

1
git clone [email protected]:lixuanliming/frelon.git

Git 分支

创建 Git 分支

1
$ git checkout -b bayu git checkout -b bayu

-b 表示 branch 相当于下面两条命令 Git branch bayu 建立’bayu’分支 Git check bayu 切换到’bayu’分支

查看分支

1
$ git branch

当前分支前面会标一个*号

合并分支到当前分支

Fast 合并分支

1
$ git merge frelon

注意提示的 Fast-forward 信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward

常规合并分支

1
$ git merge --no-ff -m "merge with no-ff" frelon

合并分支时,加上–no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。

删除多余分支

1
$ git branch -d bayu

丢弃未合并的分支

1
$ git branch -D fork1

假设 fork1 是未合并的分支,那么用 13.4 中的删除方法并不可行,只能用 -D 强制删除查看分支: git branch 创建分支: git branch 切换分支: git checkout 创建 + 切换分支: git checkout -b 合并某分支到当前分支: git merge 删除分支: git branch -d

Git 冲突解决

Git 合并时遇到的冲突问题 当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。用 git log --graph 命令可以看到分支合并图。

查看分支合并图

1
$ git log --graph

15.git 解决 bug 分支的问题 修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除。当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复 bug,修复后,再 git stash pop ,回到工作现场。

  • 把工作区的文件暂时隐藏起来
1
$ git stash
  • 切换到 master 分支下面
1
$ git checkout master
  • 建立 issue-101 的修复 bug 的分支 “并进入该分支修复 bug”
1
$ git checkout -b issue-101
  • 把文件提交到暂存区
1
2
3
$ git add xxx.py

$ git commit -m "fix bug 101" 提交文件到仓库
  • 回到原分支
1
$ git checkout master
  • 删除 issue-101 分支
1
$ git merge --no-ff -m "merged bug fix 101" issue-101
  • 返回原分区
1
$ git checkout dev
  • 还原工作区
1
$ git status
  • 继续工作
1
$ git stash pop

Git 的多人协作

查看远程仓库的信息

1
$ git remote -v(显示详细信息)

推送分支到远程仓库

1
2
3
$ git push origin master 这是推送主分支(origin是远程仓库的名字)

$ git push origin dev 还可以推送别的副分支(origin是远程仓库的名字)

抓取分支 从本地推送分支

使用 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 标签管理

Git 创建标签

1
$ git tag tag_Name

对 Git 已经 commit 过的历史文件打标签

1
$ git log --pretty=oneline --abbrev-commit 查看log中所记录的commit id
1
2
3
4
5
6
7
$ git tag v0.9 f52c633 
#对commit id为 f52c633 的文件打上标签为 v0.9
#还可以创建带有说明的标签,
#用-a指定标签名,-m指定说明文字
#如下实例:

$ git tag -a v0.1 -m "blabla" 1094ad

查看标签信息

1
2
$ git tag 查看所有 tag信息
$ git show <tagname> 查看指定tag信息

推送标签到远程

1
2
$ git push frelon v1.0 给某个仓库打标签
$ git push frelon --tags 一次性推送全部尚未推送到远程的本地标签,前提是本地都打了标签

删除标签

1
$ git tag -d v0.1

这适用于尚为推送到远程仓库使用如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

1
$ git tag -d v0.9 $ git push frelon :refs/tags/v0.9

命令 git push origin 可以推送一个本地标签;

命令 git push origin --tags 可以推送全部未推送过的本地标签;

命令 git tag -d 可以删除一个本地标签;

命令 git push origin :refs/tags/ 可以删除一个远程标签。

本文参考 廖雪峰的官方网站/Git教程

曾经在微信公众上也发过,但是因为公众号维护起来比较麻烦就拖到这里来了,文章写的匆忙,如有错误欢迎评论区指导/纠正

Licensed under CC BY-NC-SA 4.0