Git-教程-学习记录-廖学峰


官网地址

1.Git简介

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

在这里插入图片描述

基于C语言;
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多;
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库;
现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了

1.1 安装Git

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

1.2 创建版本库

$ mkdir learn-git
$ cd learn-git
$ pwd
/Users/michael/learn-git

$ ls -ah
初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:
使用命令git add <file>,注意,可反复多次使用,添加多个文件;
使用命令git commit -m <message>,完成。
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

2. 时光机穿梭

$ git status
$ git diff readme.txt
$ git status
$ git diff file
$ git add file
$ git status
$ git commit -m "add.."
$ git status
  • git status 命令可以让我们时刻掌握仓库当前的状态
$ git status
On branch master
nothing to commit, working tree clean
  • git diff顾名思义就是查看difference
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 8d163b5..9cbe8e6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 git is free software.
$ git status
On branch master
nothing to commit, working tree clean

修改文件操作步骤:

$ git status
$ git diff file
$ git add file
$ git status
$ git commit -m "add.."
$ git status

2.1 版本回退

$ git log
$ git log --pretty=oneline
$ git reset --hard HEAD^
$ git reset --hard d5939e
$ git reflog

#版本控制系统命令可以告诉我们历史记录
$ git log
$ git log --pretty=oneline
d5939e604946d2ca7ba8c7b9779aa24c1b4a9702 (HEAD -> master) append GPL
37a97c8a3e5826625f4a275529fb3476fc2cf9e9 add distributed
240af07af876a1994ae2e8b4c8599ba14d4a3a96 wrote a readme file
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,
使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

在这里插入图片描述

2.2 工作区和暂存区

在这里插入图片描述

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

在这里插入图片描述
在这里插入图片描述

2.3 管理修改

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

2.4 撤销修改

$ git status
$ git checkout -- readme.txt
$ git reset HEAD readme.txt
$ git checkout -- readme.txt
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

2.5 删除文件

$ rm test.txt
$ git rm test.txt

3 远程仓库

GitHub上免费托管Git仓库

$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到.ssh目录,
里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,
id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

3.1 添加远程库

要关联一个远程库,使用命令:

git remote add origin git@server-name:path/repo-name.git

关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;
关联后,使用命令第一次推送master分支的所有内容:

git push -u origin master
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,
就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!
当有网络的时候,再把本地提交推送一下就完成了同步。

3.2 从远程库克隆

$ git clone git@github.com:michaelliao/gitskills.git
$ git clone https://username@bitbucket.org/FlexivTeam/flexiv_sw.git

4.分支管理

支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件
在这里插入图片描述

4.1 创建与合并分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

在这里插入图片描述

4.2 解决冲突

$ git switch -c feature1
$ git merge feature1
$ git status
$ git log --graph --pretty=oneline --abbrev-commit
$ git branch -d feature1

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
在这里插入图片描述

4.3 分支管理策略

$ git switch -c dev
$ git add readme.txt 
$ git commit -m "add merge"
$ git switch master
$ git merge --no-ff -m "merge with no-ff" dev
$ git log --graph --pretty=oneline --abbrev-commit

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
可以看到,不使用Fast forward模式,merge后就像这样:
在这里插入图片描述

4.4 Bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
$ git status
$ git stash
$ git checkout master
$ git checkout -b issue-101
$ git add readme.txt 
$ git commit -m "fix bug 101"
$ git switch master
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git switch dev
$ git status
$ git stash list
$ git stash pop
$ git stash list
$ git stash apply stash@{0}
$ git branch
$ git cherry-pick 4c805e2

同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支.

4.5 Feature分支

$ git switch -c feature-vulcan
$ git add vulcan.py
$ git status
$ git switch dev
$ git branch -d feature-vulcan
$ git branch -D feature-vulcan

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

4.6 多人协作

$ git remote -v
$ git push origin master
$ git pull
$ git branch --set-upstream-to <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,如果有冲突,要先处理冲突。

4.7 rebase

$ git log --graph --pretty=oneline --abbrev-commit
$ git push origin master
$ git rebase
$ git log --graph --pretty=oneline --abbrev-commit

rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

5 标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。

5.1 创建标签

$ git branch
$ git log --pretty=oneline --abbrev-commit
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
$ git show v0.1
$ git tag
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。

5.2 操作标签

$ git tag -d v0.1
$ git push origin v1.0
$ git push origin --tags
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

6 Github

在这里插入图片描述

在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。

7 Gitee

在这里插入图片描述

8 自定义Git

让Git显示颜色,会让命令输出看起来更醒目:

$ git config --global color.ui true

8.1 忽略特殊文件

忽略某些文件时,需要编写.gitignore;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

8.2 配置别名

$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
$ vim .git/config #仓库git配置文件
$ vim .gitconfig #当前用户

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值