廖雪峰Git教程—学后笔记

本文是看完廖雪峰Git教程后,做的一个教程笔记,方便自己查阅。

廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000


一、创建版本库
git init 初始化一个git仓库
git add file—name 添加文件到git暂存区
git commit -m“说明描述” 提交文件到git仓库


二、时光穿梭
1.查看状态
git status 查看git仓库的当前状态,文件是否被修改过
git diff 查看文件被修改的地方

2.版本回退
git log 查看当前版本之前的提交日志,包括每次提交的:版本号、作者、日期、提交说明
HEAD 指向当前版本

git log --pretty=oneline 查看之前commit日志,包括每次commit的:版本号、提交说明

git reset --hard HEAD^ 退回上一个版本,HEAD指向上一个版本
git reset --hard HEAD^^ 退回上上个版本,HEAD指向上上个版本
git reset --hard HEAD~10 退回前10个版本,HEAD...

cat file-name 显示文件内容

git reset --hard 版本号 回到指定版本

git reflog 查看历史提交/切换日志,包括:版本号、提交说明


3.工作区和暂存区

工作区——>git add ——>暂存区——>git commit——>分支master/版本库
Git是跟踪修改的,每次修改,如果不用git add到暂存区,那就不能用commit提交到master分支上。

总结:修改暂存区:命令前加git,eg: git add /git rm
修改版本库:先修改暂存区,然后统一git commit即可


4.管理修改

每次修改,必须先用 git add 到暂存区,然后再 git commit 到版本库中。


5.撤销修改:

场景1:只是在工作区修改
git checkout -- file_name 把文件在工作区的修改全部撤销,使其恢复到最近一次add、commit的状态

场景2:在工作区修改 + add到暂存区
git reset HEAD file_name 把文件在暂存区的修改全部撤销,使其恢复到工作区被修改的状态
git checkout -- file_name

场景3:在工作区修改 + add到暂存区 + commit(前提:你没有push到远程库)
git reset --hard HEAD^ 直接退回上一个版本

6.删除文件:

1.工作区删除:rm file_name 删除文件夹:rm -r name
1.暂存区删除:git rm file_name 删除文件夹:同上
2.版本库中删除:git rm file_name + git commit -m"说明"
3.将远程库的文件/文件夹删除,但本地保留:
git rm -r --cached file_name
git commit -m""
git push -u origin master

7.恢复误删的文件:

场景:文件已提交到版本库,但工作区的误删除了,要恢复
git checkout -- file_name 用版本区的版本替换工作区的版本


三、远程仓库

1.设置SSH Key:本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要设置SSH Key

(1).创建SSH Key:过程略
(2).添加ssh key到GitHub

2.在GitHub上创建新仓库:略

3.关联本地库和github仓库:其实就是在本地库使用git命令添加远程主机+远程仓库
(1) git remote add origin git@github.com:Github用户名/Github仓库名.git
(2) git remote add origin https://github.com/Github用户名/Github仓库名.git
优先选用第一种方法,速度快

git remote add origin git@gitlab.liquidnetwork.com:wanghailin/sklearn.git

4.将本地库同步/推送到远程库: 将本地库的当前分支与远程库的远程分支关联
第一次同步:git push -u origin master
以后的同步:git push origin master

5.如果远程库是空的,可以直接将本地库的文件push到远程库
如果远程库非空+远程分支和本地分支相关,需要用git pull origin master先把远程库的最新branch拉到本地库,与本地库的master合并,然后再git push
如果非空+不相关:git pull合并分支失败,则要用:git pull origin master --allow-unrelated-histories + git push

6.git push命令的区别:
(1)git push <远程主机名> <远程分支名>:一般,远程主机名为origin,分支名为master,即git push origin master

(2)git push -u origin master:将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了

(3)git push:-u指定了默认主机+默认分支,或者当前分支只追踪一个远程分支,则可以省略主机名+分支名


5.将远程库克隆到本地库: git clone git@github.com:Github用户名/Github仓库名.git

NOTE: (1)remote/origin都表示远程主机名
(2)git clone 不需要git init

7.git clone、git pull和git fetch的用法及区别:详情见收藏文件夹
(1)git clone <版本库的url>:
本地无需git init,直接将远程仓库clone到本地,包括被clone仓库的版本变化
(2)git pull <远程主机名> <远程分支名>:<本地分支名>
git pull = git fetch + git merge,即将远程仓库的分支拉取下来与本地当前分支合并,
(3)git fetch
更新远程代码到本地仓库,但没有合并



四、分支管理
1.理解分支:工作区——> add ——>暂存区——> commit——>分支master/本地版本库——> push ——>远程库
在开发新功能时,你如果每天都把未完成的新版本都commit到master分支上,会影响master的程序,所以你可 以创建一个新分支,每次都把新版本commit到新分支,待程序完成之后,再将新分支合并到master分支上

1.1 疑问:只把新版本commit到本地库,不push到远程库,不就行了???等开发完毕,再统一push到远程库???


2.创建和合并分支:

git checkout -b dev 创建并切换到dev分支
相当于两条命令:
git branch dev 创建分支dev
git checkout dev 切换到分支dev

git branch 列出所有分支,并用*标明当前分支

git add file—name
git commit -m“说明描述” 此时是在dev分支上提交

git checkout master 切换到分支master,此时查看文件,添加的内容消失

git merge dev 将分支dev合并到master

疑问:合并是求两个分支的并集吗???

git branch -d dev 删除分支dev



3.解决冲突:当待合并的两个分支内容相互冲突时,git merge branch_name,显示合并失败

Cat file_name 查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将合并失败的部分修改后,再合并

git log --graph 查看分支合并图


4.分支管理策略

git merge --no-ff -m "commit说明描述" dev ?????

master分支:应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
dev分支:干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到 master上,在master分支发布1.0版本;
个人分支:每个人都有自己的分支,时不时地往dev分支上合并就可以了

个人理解:master分支上只能创建dev分支,用于干活,其他个人分支都是在dev分支上创建的,也就是说,master分支只和 dev分支相连。


5.bug分支

git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作

git checkout master 切换到master分支
git checkout -b issue-101 建立并切换到bug分支,修复bug
git add ~
git commit -m“” 提交
git checkout master 切换到master分支
git merge --no-ff -m "merged bug fix 101" issue-101

git stash list 查看保存的工作现场列表

git stash apply 恢复保存的工作现场,但stash内容不删除,要用 git stash drop 来删除
git stash pop 恢复保存的工作现场,同时把stash删除


个人疑问:
1.实验证明,在dev分支没有提交的时候,是可以切换到master分支上新建bug分支的。 好像不是???
2.那为什么不直接切回到master分支上,新建bug分支,修复bug,合并到master,再切回dev分支工作不就行了????
3.为什么还非要stash一下??意义何在???

解答: 1.实验证明,在dev分支的修改没有commit/stash的时候,不能切回到master分支上
2.所以在master上新建bug分支,必须先在dev上stash,才能切回到master分支上
3.实验证明,在dev分支的修改没有commit/stash的时候,可以在dev分支上新建并切换到新分支


6.feature分支:

个人理解:
1.bug分支<——master分支——>dev分支——>个人分支,一般的,新分支在哪个分支上建立的,删除时就要在其对应的分支上删除。
2.一般情况下,分支只有被合并后才能删除。如果新分支没有被合并就需要删除,需要强制删除

git branch -D branch_name 强制删除分支


7.多人协作

git remote 查看远程库的信息
git remote -v 查看远程库更详细的信息

git push origin branch_name 将分支推送到远程库/同步

master分支: 是主分支,因此要时刻与远程同步;
dev分支: 是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支: 只用于在本地修复bug,没必要推到远程,修复完毕后直接合并到master分支即可
feature分支:是否推到远程,取决于你是否和你的小伙伴合作在上面开发。如果feature是个人开发,则不用推送,开发完毕直接合并到 master即可


git clone git@github.com:Github用户名/Github仓库名.git 抓取远程仓库到本地,默认情况下,抓取后的本地仓库,只能 看到本地的master分支

git branch 显示只有一个master分支

git checkout -b dev origin/dev 抓取dev分支到本地:创建并切换到dev分支,且dev分支是 远程库的dev分支

NOTE: git clone 本地后,先cd到本地仓库后,再抓取dev分支到本地。然后就可以在dev分支上开发,并push到远程

在dev分支上修改,提交后,push到远程仓库。然后另一个人也同样在本地的dev修改,提交,push到远程.push失败,因为远程仓库包含了本地没有的内容,原因是有其他人push,同步了远程仓库和其他本地库。
解决方法:先用git pull把最新的提交从origin/dev抓下来,然后在本地merge,解决冲突,在push


git branch --set-upstream-to=origin/dev dev 设置dev和origin/dev的链接

git pull git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一 样。解决后,提交,再push


8.多人协作模式的总结:

(1)首先,可以试图用git push origin <branch-name>推送自己的修改;

(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

(3)如果合并有冲突,则解决冲突,并在本地提交;

(4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。


9.Rebase

git rebase 把本地未push的分叉提交历史整理成一条直线,使其看上去更加的直观




五、标签管理

1.理解:每次commit都是一个版本,对应一个版本号,版本号是一连串的数字,不便于交流,所以有了标签/tag
eg: commit_1 版本号:6a5819e... tag:v1.2

2.创建标签

git branch 查看分支
git checkout branch_name 切换到想打tag的分支

git tag tag_name 打标签(默认对该分支的最新commit打标签/HEAD)
git tag tag_name 版本号 对版本号对应的commit打标签
git tag -a tag_name -m"说明" 版本号 同上,并带有说明

git tag 查看所有标签

git show tag_name 查看标签信息,有说明的标签,可以看到说明信息


3.操作标签

git push origin tag_name 推送一个本地标签
git push origin --tags 推送所有未推送过的标签

删除标签:
(1)git tag -d tag_name 删除一个本地标签
(2)git push origin :refs/tags/tage_name 删除一个远程标签



六、使用GitHub

别人的github仓库 ——> fork ——> 自己的github仓库 ——> clone ——> 本地仓库 ——> 修改

别人的github仓库 <—— request <—— 自己的github仓库 <—— push <—— 本地仓库 <——



七、使用码云

1.码云:国内的git托管,功能和github相同,但是比github速度快

2.添加公钥:和github相同

3.关联: git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git

但是会显示关联失败,因为本地库learn已经关联到github了

git remote -v 查看远程库的信息

解决方法:
(1)先删除本地库和github的关联,再关联本地库和gitee的远程库
git remote rm origin 删除本地库和远程库的关联
git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git 再关联本地库和gitee的远程库

git remote -v 查看此时的远程库信息

(2)本地库同时关联两个远程库:github + gitee
git remote rm origin 删除本地库和远程库的关联
git remote add github git@github.com:hailin2018/learn.git 关联本地库和github
git remote add gitee git@gitee.com:hailin2018/learn.git 关联本地库和gitee

git remote -v 查看此时的远程库信息


4.push:

NOTE: remote/origin都表示远程库

git push origin branch_name 将分支推送到远程库/同步,远程库名称为关联时定义的origin

git push github master 将master分支推送到github远程库

git push gitee master 将master分支推送到gitee远程库




八、自定义Git

1.git config --global color.ui true 让git显示颜色


2.忽略特殊性文件:
问题:有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,每次git status都会显示Untracked files
办法:(1)在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
(2)把.gitignore也提交到Git


3.配置别名/简化命令
eg:

git config --global alias.st status 简化 status 为 st
git config --global alias.ci commit 简化 commit 为 ci
git config --global alias.br branch 简化 branch 为 br

git config --global alias.unstage 'reset HEAD'


4.配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用

用户的git配置文件在用户主目录(admin)下的一个隐藏文件.gitconfig中
仓库的Git配置文件都放在.git/config文件中:

删除别名,直接删除对应的行即可


5.搭建gig服务器

在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。




































原文地址:https://www.cnblogs.com/hailin2018/p/13507569.html