创建版本库
第一步,创建一个空白目录:
$ mkdir learngit
$ cd learngit
第二步:通过 git init
命令把这个目录变成 Git 可以管理的仓库:
$git init
把文件添加到版本库
第一步,用 git add
命令把文件添加到仓库:
$ git add readme.txt
第二步,用 git commit
命令告诉 Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
查看结果,时刻掌握仓库当前的状态:
$ git status
查看 difference:
$ git diff readme.txt
版本回退
查看从最近到最远的提交日志
$ git log --pretty=oneline
在 Git 中,用 HEAD
表示当前版本,上一个版本是 HEAD^
,上上个版本是 HEAD^^
,往上 100 个版本是 HEAD~100
.
回退到上一个版本:
$ git reset --hard HEAD^
回退到任意版本(注:123e4ad23f 是版本的散列码):
$ git reset --hard 123e4ad23f
找到commit id命令:
$ git reflog
多次修改提交方法:
- 第一次修改 ->
git add <filename>
-> 第二次修改 ->git add <filename>
-> ... -> 第 n 次修改 ->git add <filename>
->git commit -m "info"
撤销修改
丢弃工作区的修改:
$ git checkout -- readme.txt
撤销掉暂存区的修改,重新放回工作区:
$ git reset HEAD readme.txt
示例:
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存时,想丢弃修改,分两步,第一步用命令
git reset HEAD file
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,首先回退版本库
git reset --hard HEAD^
,再重新更改作业后提交,不过前提是没有推送到远程库。
删除文件
前提,向版本库添加文件:
$ git add test.txt
$ git commit -m "add test.txt"
删除工作区文件:
$ rm test.txt
此时, Git 已经知道文件被删除,工作区和版本库就不一样了,使用 git status
命令可以查看哪些文件被删除了。
两个选择:
- 一是 确实要从版本库中删除该文件
$ git rm test.txt
- 二是 删错了,将误删的文件恢复到最新版本(会丢失最近一次提交后修改的内容)
$ git checkout -- test.txt
远程仓库 - GitHub 使用
第一步: 创建 SSH Key。在用户主目录下,看看有没有 .ssh 目录,如果有,再看看这个目录下有没有 id_rsa
和 id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开 Shell(Windows 下打开 Git Bash),创建 SSH Key:
$ ssh-keygen -t rsa -C "email_example@email_server.com"
一路回车,使用默认值即可,顺利的话就可以在用户主目录里找到 .ssh
目录,里面有 id_rsa
和 id_rsa.pub
两个文件,这两个就是 SSH Key 的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第二步,登录 GitHub, 打开 Account setting,SSH Keys 页面,然后,点击 Add SSH Key,填上任意的 Title,在 Key 文本框中粘贴 id_rsa.pub 文件中的内容,点击 Add Key,就能看到已经添加的 Key。
添加远程库
首先,登录 GitHub,然后找到 Create a new repo 按钮,创建一个新的仓库
在 Repository name 填入 learngit 其他保持默认设置,点击 Create respository 按钮,就成功地创建了一个新的 Git 仓库。
根据提示有两种选择:
- 可以从这个仓库克隆出新的仓库
- 可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到 GitHub 仓库。
在本地 learngit
仓库下运行命令:
$ git remote add origin git@github.com:yourname/learngit.git
下一步,将本地库中的所有内容推送到远程库上(实际上就是把当前分支 master
推送到远程):
$ git push -u origin master
从远程库克隆
$ git clone git@github.com:yourname/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
分支管理
创建与合并分支
首先,创建 dev
分支,然后切换到 dev
分支
$ git checkout -b dev
git checkout
命令加上 -b
参数表示创建并切换,相当于两条命令:
$ git branch dev
$ git checkout dev
然后,用 git branch
命令查看当前分支:
$ git branch
* dev
master
列出所有分支,加 *
号的是当前分支
然后,我们就可以在 dev
分支上正常提交:
$ git add readme.txt
$ git commit -m "branch test"
现在 dev
分支的工作完成,我们就可以切换回 master
分支:
$ git checkout master
此时在 master
分支中是看不到刚刚提交的 readme.txt
文件的。
现在把 dev
分支的工作成果合并到 master
分支上:
$ git merge dev
合并完成后就可以放心的删除 dev
分支了:
$ git branch -d dev
删除后查看 branch
,就只有 master
分支了:
$ git branch
解决冲突
用 git log --graph
命令可以看到分支合并图。
修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场 git stash
一下,然后去修复 bug,修复后,再 git stash pop
,回到工作现场。
如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name>
强行删除。
多人协作
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示 “no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。这就是多人协作的工作模式,一旦熟悉了,就非常简单。
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
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 tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; -
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; -
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签; - 命令
git tag
可以查看所有标签。
操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。