两小时 Git 入门
建立 Git 仓库
把文件添加到仓库
把文件提交到仓库
1
|
$ git commit -m "wrote a readme file"
|
查看提交结果/对比工作区和文件和仓库文件的不同之处
比对并列出文件和仓库文件的不同之处
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
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 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
第 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 参数
关于远程仓库
从远程仓库克隆 如果自己需要新建一个项目,且从零开发,那么最好的方式是先创建远程库,然后,在 shell 里从远程库克隆
建仓库过程省略,在建立仓库的时候我们可以勾选 Initialize this repository with a README,这样 GitHub 会自动为我们创建一个 README.md 文件。创建完毕后,可以看到 README.md 文件
Clone 远程仓库
Git 分支
创建 Git 分支
1
|
$ git checkout -b bayu git checkout -b bayu
|
-b 表示 branch 相当于下面两条命令 Git branch bayu 建立’bayu’分支 Git check bayu 切换到’bayu’分支
查看分支
当前分支前面会标一个*号
合并分支到当前分支
Fast 合并分支
注意提示的 Fast-forward 信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward
常规合并分支
1
|
$ git merge --no-ff -m "merge with no-ff" frelon
|
合并分支时,加上–no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。
删除多余分支
丢弃未合并的分支
假设 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
命令可以看到分支合并图。
查看分支合并图
15.git 解决 bug 分支的问题 修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除。当手头工作没有完成时,先把工作现场 git stash
一下,然后去修复 bug,修复后,再 git stash pop
,回到工作现场。
- 建立 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 merge --no-ff -m "merged bug fix 101" issue-101
|
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 创建标签
对 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.9 $ git push frelon :refs/tags/v0.9
|
命令 git push origin
可以推送一个本地标签;
命令 git push origin --tags
可以推送全部未推送过的本地标签;
命令 git tag -d
可以删除一个本地标签;
命令 git push origin :refs/tags/
可以删除一个远程标签。
曾经在微信公众上也发过,但是因为公众号维护起来比较麻烦就拖到这里来了,文章写的匆忙,如有错误欢迎评论区指导/纠正