目录
一、基本Linux命令使用
ls
:展示当前目录下的子文件子文件夹pwd
:展示当前所在的路径mkdir
:创建一个子文件夹touch
:创建某个文件cd
:进入到某个目录
cd..
:回退到上层目录cp a.txt b.txt
:拷贝a文件到b文件
cp -r a/ b
:拷贝a目录到b目录mv a.js abc
:移动a文件到abc目录下
mv a.js aaa.js
:重命名a,命名为aaarm
:删除某个文件
rm -r
:删除某个文件夹cat
:查看某个文件的内容vim
:编辑某个文件(接着按i
进入编辑模式;按Esc
键退出编辑状态,然后输入:wq
回车,保存修改并退出)
二、Git工作流程
- clone/fetch(克隆/抓取):clone,从远程仓库(gitee、github等)中克隆代码到本地。fetch,从远程仓库抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
- checkout(检出):从本地仓库检出一个仓库分支(分支,下面会讲)然后进行修订。
- add(添加):在提交前先将代码提交到暂存区。
- commit(提交):提交到本地仓库。本地仓库中保存修改的各个历史版本。
- pull (拉取):从远程仓库拉到本地仓库,自动进行合并(merge),任何放到工作区,相当于fetch+merge。
- push(推送):修改完成后,将代码推送到远程仓库。
三、基本Git命令使用
- 创建目录(例如目录名为git_test)并在目录下打开git bash,一个本地git仓库就建好了。
- 初始化git仓库,命令:
git init
,仓库中有.git
文件就说明仓库初始化好了。 - 在目录下对文件进行的增删更等修改后加入到暂存区,命令:
git add .
,.
表示全部加入,也可以改为文件名,将某个文件加入到暂存区。 - 将修改提交到本地仓库,命令:
git commit -m '备注信息'
,每提交一次就是一次版本的更新。 - 查看日志,命令:
git log
- 查看修改状态(暂存区、工作区),命令:
git status
- 回退版本
命令:git reset --hard commitID
,其中commitID
可以通过git log
指令查看。 - 查看已经删除的记录:
git reflog
- 不被git所管理的文件
在文件名为.gitignore
的文件中配置不被git所管理的文件
四、Git分支基本了解
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
- 查看分支,命令为
git branch
- 创建本地分支,命令为
git branch 分支名
(创建不切换到该分支)或git checkout -b 分支名
(创建并切换到该分支) - 切换分支,命令为
git checkout 分支名
- 合并分支,一个分支上的提交可以合并到另一个分支,命令为
git merge 分支名称
(例如,在a分支中输入命令git merge b
,则是将b分支合并到a分支上) - 删除分支,不能删除当前分支,只能删除其他分支。命令为
git branch -d 分支名
(删除分支时,需要做各种检查)或git branch -D 分支名
(强制删除,不做任何检查)
五、解决分支合并产生的冲突
先说一个背景:
这里有一个master主分支,里面有一个名为a的文件;此时,输入命令git checkout -b fenzhi
来创建并切换到名为fenzhi的分支中来,此时分支fenzhi和主分支master中的文件一样,都是a,a的内容也一样。
此时我们是在分支fenzhi中的,我们通过vim a
来修改一下文件a的内容,这里修改为我是fenzhi里面的a了
,:wq
保存后,git add .
提交到暂存区,再git commit -m '提交a'
提交到仓库,fenzhi这就更新了版本。
接着通过git checkout master
回到主分支master中去,此时也修改主分支master中的a文件的内容,修改为我是master里面的a了
,然后提交暂存区,并提交到仓库,master更新了一个版本。
此时就要通过git merge fenzhi
把分支fenzi合并到主分支master上去,就会产生冲突,因为fenzhi中的a的内容和master中a的内容不一样了。
该分支中的a就会变为:
这就需要重新修改a里的内容(不一定要修改成这两个分支中的内容,也可以修改成其他内容)
最后通过git add .
和git commit -m 'xxx'
提交到仓库即可。
六、在开发中分支使用的原则和流程
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般使用上图流程,具体分析如下:
- master(生产)分支:主分支,中小规模项目作为线上运行的应用对应的分支
- develop(开发)分支:是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发后,需要合并到master分支,准备上线
- feature/xxxx分支:从develop创建的分支,一般同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支
- hotfix/xxxx分支:从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、textdevelop分支
- 还有一些其他分支,不再细说,例如test分支(用于代码测试)、pre分支(预上线分支)等等
七、本地仓库到远程仓库
-
常用的远程仓库:github、gitee、gitlab,下面有gitee来讲解。
-
注册gitee账号。
-
创建远程仓库。
-
配置SSH公钥。(用来认证身份)
第一步:输入命令ssh-keygen -t rsa
,三次回车
第二步:生成的公钥以文件存在本地,输入cat ~/.ssh/id_rsa.pub
读取,复制公钥。
第三步:在gitee上设置:
第四步:验证是否配置成功,输入命令:ssh -T git@gitee.com
类似这样即配置成功。 -
在本地添加远程仓库。命令:
git remote add <远端名称> <仓库路径>
远端名称默认是origin,取决于远端服务器设置。
仓库路径,从远端服务器获取URL
例如git remote add origin git@gitee.com:yang_123han/git_test.git
-
查看远程仓库。命令:
git remote
-
推送到远程仓库。命令:
git push [-f] [--set-upstream] [远端名称 [本地分支名]:[远端分支名]]
。
如果远端分支名和本地分支名相同,则可以只写一个分支名,例如git push origin master
。
-f
:强制覆盖远端仓库,一般用不到。
--set-upstream
:推送到远端的同时并且建立与远端分支的关联关系。例如git push --set-upstream origin master
;
如果当前分支已经和远端分支关联,则可以省略远端名和分支名,例如git push
将master分支推送到已关联的远端分支。
如果当前分支已经和远端分支关联,可以通过git branch -vv
查看本地分支与远端分支的对应关系。
八、远程仓库到本地仓库
- 从远端仓库克隆
如果已经有了一个远端仓库,我们可以直接clone到本地。
命令:git clone <仓库路径> [本地目录]
本地目录可以省略,会自动生成一个目录。 - 从远程仓库中抓取和拉取
远程分支和本地分支一样,我们可以进行merge
(合并分支)操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
①抓取(fetch),就是将远程仓库里的更新都抓取到本地,但是不会进行合并。
命令为:git fetch [远端名称] [分支名]
如果不指定远端名称和分支名,则抓取所有分支。
②拉取(pull),就是将远端仓库的更新拉取到本地并且自动进行合并,等同于fetch+merge
。
命令为:git pull [远端名称] [分支名]
如果不指定远端名称和分支名,则抓取所有分支并合并。
九、解决远端仓库分支合并冲突
这个和前面本地分支合并冲突差不多。
先说一个背景:在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时就会发生合并冲突。
A用户在本地修改代码后优先push
(推送)到远程仓库,此时B用户在本地修订代码,commit
(提交)到本地仓库后,也需要push
到远程仓库,此时B用户晚于A用户,故B用户需要先pull
(拉取)远程仓库的提交,经过merge
(合并)后才能push
到远程分支。
如下图所示:
在B用户拉取代码时,因为A、B用户同一段时间修改了同一文件的相同位置代码,故会发生合并冲突。
远程分支也是分支,所以合并是冲突的解决方式也和解决本地分支冲突相同。
总的来说,同一时间就是A和B都修改了同一文件同一个地方,然后A先推送到远程仓库,B慢了一步,就需要先重新把远程仓库拉取一下,此时拉取来的远程仓库是A之前推送的,就会有冲突,需要B本地解决这个冲突(看前面第五节),再重新推送到远程仓库。
十、指令速查
1、基本操作类
git init
:初始化仓库git log
:查看日志(常用)git add .
或git add 文件名
:全部添加到暂存区或某个文件提交到暂存区(常用)git commit -m '注释信息'
:将暂存区内容提交到仓库(常用)git reset --hard commitID
:版本回退
2、分支类
git branch
:查看分支git checkout 分支名
:切换到某个分支(常用)git checkout -b 分支名
:创建并切换分支(常用)git merge 分支名
:合并分支(常用)git branch -d 分支名
:删除分支,需要做各种检查(d改为D,强制删除,不检查)
3、远程操作类
git remote add <远端名称> <仓库路径>
:在本地添加远程仓库。远端名称默认是origin。git remote
:查看远程仓库。git push [-f] [--set-upstream] [远端名称 [本地分支名]:[远端分支名]]
:推送到远程仓库。如果远端分支名和本地分支名相同,则可以只写一个分支名。-f
:强制覆盖远端仓库,一般用不到。--set-upstream
:推送到远端的同时并且建立与远端分支的关联关系。(常用)git clone <仓库路径> [本地目录]
:clone远程仓库到本地。git fetch [远端名称] [分支名]
:将远程仓库里的更新都抓取到本地,但是不会进行合并。git pull [远端名称] [分支名]
:将远程仓库里的更新都抓取到本地并且进行合并。相当于fetch+merge。(常用)
注意:
checkout
(切换)分支前,先commit
(提交)本地的修改。- 代码及时
commit
(提交),提交过了就不会丢。--set-upstream
建立联系了的分支,就可以直接git push
和git pull
等操作。