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 加密的,所以,需要一点设置:

  1. 创建 SSH Key。打开 Shell,创建 SSH Key:

     ssh-keygen -t rsa -C "youremail@example.com"

    你需要把邮件地址换成你自己的邮件地址,然后设置密码。可以在用户主目录里找到 .ssh 目录,里面有 id_rsaid_rsa.pub 两个文件,这两个就是 SSH Key 的秘钥对,id_rsa 是私钥,不能泄露出去,id_rsa.pub 是公钥,可以放心地告诉任何人。

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

  3. 测试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

速查表

Git 常用命令速查表


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。

目录