Git 学习笔记
安装
Debian 或 Ubuntu Linux
sudo apt-get install git
配置Git
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
每个仓库的Git配置文件都放在.git/config文件中
配置别名
# st就表示status
$ git config --global alias.st status
查看Git 的配置信息
git config --list
git config --global --list
创建版本库
# 创建目录
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
把文件添加到仓库
$ git add readme.txt
# 一次提交多个文件
$ git add file2.txt file3.txt
# 提交当前目录下所有有改动的文件
$ git add .
这个文件被.gitignore忽略了,用-f 强制添加到Git
$ git add -f App.class
把文件提交到仓库
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
-m
后面输入的是本次提交的说明
查看仓库当前的状态
git status
查看文件差异
git diff readme.txt
查看历史记录
git log
# 加上--pretty=oneline参数,每行显示一条记录
git log --pretty=oneline
# reset后的历史,(HEAD -> master)指向的是当前的版本
git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-commit --reflog
* b953931 - vwx (#2180) (1 weeks ago)
* 946d053 - stu (#2178) (2 weeks ago)
* bad5188 - pqr (#2179) (2 weeks ago)
* e5970a5 - (HEAD -> master) mno (#2183) (3 weeks ago)
* 1b7c09a - jkl (#2190) (3 weeks ago)
* 47d28ee - ghi (#2189) (3 weeks ago)
* ebe8f55 - def (#2187) (3 weeks ago)
* 7a16406 - abc (#2186) (3 weeks ago)
回退
用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写成HEAD~100
。
回退到上一个版本
# windows下输入回车 需要再按下^
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
丢弃工作区的修改
只能恢复修改的文件,新增的文件不会被删除
一种是readme.txt自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;
git checkout -- file
# 恢复当前目录下全部文件
git checkout -- .
一种是readme.txt已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。
把暂存区的修改撤销掉(修改还在,只是不在暂存区里了,需要重新add,或者用checkout恢复至版本库里的状态)
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
或者使用git reset --hard head
直接恢复至版本库里的状态
删除文件
从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
删错了,恢复 git checkout
远程仓库
设置
由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过 SSH 加密的,所以,需要一点设置:
创建 SSH Key。打开 Shell,创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后设置密码。可以在用户主目录里找到
.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key
的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。登陆 GitHub,打开
Account settings
,SSH Keys
页面,然后,点Add SSH Key
,填上任意 Title,在 Key 文本框里粘贴id_rsa.pub
文件的内容测试ssh key是否成功,使用命令“ssh -T git@github.com”,如果出现You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。
添加远程库
本地仓库关联远程库
# 方式一
git remote add origin git@github.com:用户名/仓库名.git
# 方式二
git remote add origin https://github.com/用户名/仓库名.git
添加后,远程库的名字就是 origin,这是 Git 默认的叫法,也可以改成别的
把本地库的所有内容推送到远程库上:
git push -u origin master
第一次推送 master 分支时,加上了 -u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push origin master
如果要推送其他分支,比如 dev,就改成:
$ git push origin dev
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
# 本地和远程分支的名称最好一致;
本地分支和远程分支的链接关系创建,用命令
git branch --set-upstream branch-name origin/branch-name
从远程抓取分支
git pull
从远程库克隆
git clone https://github.com/用户名/仓库名.git
查看远程库的信息
$ git remote
origin
# 或者,用git remote -v显示更详细的信息:
$ git remote -v
origin git@github.com:****/****.git (fetch)
origin git@github.com:****/****.git (push)
# 如果没有推送权限,就看不到push的地址。
分支管理
创建与合并分支
创建分支
# 创建dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
# `git checkout`命令加上`-b`参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
# 用查看当前分支,列出所有分支,当前分支前面会标一个*号
$ git branch
* dev
master
合并分支
...省略在 dev 分支新增文件 并提交
# 切换回master分支:
$ git checkout master
Switched to branch 'master'
# 把dev分支的工作成果合并到master分支上
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支
删除分支
$ git branch -d dev
Deleted branch dev (was fec145a).
删除没有被合并过得分支
git branch -D dev
查看分支合并情况
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...
分支管理策略
合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
# 用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
当前工作现场“储藏”起来
如果需要修改BUG,但是当前工作现场有修改的内容,而且不想提交,可以先“储藏”起来
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
用git stash list
命令看看“储藏”的内容:
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了。
标签管理
创建标签
$ git tag v1.0
# 后面跟commit id 可以为之前的提交创建标签
$ git tag v0.9 6224937
# 用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
查看所有标签
$ git tag
v1.0
查看标签信息
$ git show <tagname>
删除
$ git tag -d v0.1
Deleted tag 'v0.1' (was e078af9)
创建的标签都只存储在本地,不会自动推送到远程。
如果要推送某个标签到远程:
git push origin <tagname>
# 一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
Deleted tag 'v0.9' (was 6224937)
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
To git@github.com:michaelliao/learngit.git
- [deleted] v0.9
速查表
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:Git 学习笔记
文章字数:2.1k
本文作者:Bin
发布时间:2017-12-17, 15:19:51
最后更新:2019-08-06, 00:50:51
原始链接:http://coolview.github.io/2017/12/17/Git-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。