Git 常用操作和流程
Git概念:
Git 层级:工作目录==》暂存区/缓存区==》本地git版本库;对文件的增删改操作 都需要先添加到暂存区 -- 提交到本地仓库
安装git及配置
地址:https://git-scm.com/downloads;一直下一步即可安装成功;安装成功后可以cmd命令行输入git --version查看版本
Git 的配置:
Git的初始化配git 的初始化配置: 建议配置成github或者gitee的注册的账号名称
git config --global user.name "yourname" # 配置个人用户名
git config --global user.email "youremail " #电子邮件地址置
git init # 初始化一个git项目,会在文件夹里面添加 .git的文件(本地git仓库)
查看配置信息:
git config --list #查看配置信息
常用命令:
git init 本地初始化git库
git add 文件名:把指定文件添加到暂存区
git add . :会把本地所有文件都加入暂存区,并且会根据.gitignore做过滤
git commit -m “注释信息”:提交到本地版本库
git clone 克隆
git status:查看状态
git log 查看日志历史记录信息
git reflog:查看历史记录显示版本号(用于回滚)
git log --pretty=oneline:单行查看版本历史记录
git log --graph --pretty=oneline --abbrev-commit:查看日志
git reset -- hard HEAD^ 回滚上一个版本 (用的不多)
git reset -- hard 版本号 回滚到指定版本(推荐使用这种)
git diff 比较工作区文件和本地仓库文件的区别
git pull 下载
git push 上传
git branch:查看分支
git branch 分支名: 创建分支
git branch -d dev:删除dev分支
git checkout dev:切换到dev分支
git checkout -b dev:创建并切换到dev分支
git merge dev:把dev上的内容合并到master分支上
git merge --no-ff -m “禁用FastForward模式提交” dev:禁用FastForward模式合并
git tag 标签名: 对当前版本创建轻标签
git tag:查询已创建标签
git tag -d 标签名:删除指定标签
git push origin 标签名: 推送单个标签
git push origin –tags: 推送本地所有标签
git push origin: refs/tags/标签名:远程删除指定标签
git remote:查看连接的远程仓库
git remote add gitee 远程仓库git地址:添加gitee远程仓库
git remote rm 远程仓库别名:删除远程仓库
git push gitee master:把master分支推送到gitee远程仓库
git blame 文件名:查看谁更改了file中的内容、修改时间
设定git不跟踪文件:
在工作目录创建一个名为.gitignore的文件,文件内容如下:
/new/#过滤整个文件夹
*.txt#过滤所有.txt文件
/new/test.c#过滤某个具体文件
.DS_Store#Mac用来存储文件夹信息的文件
npm-debug.log*#npm报错信息文件
git clean:从工作目录中删除没有被git跟踪过的文件
它包含如下参数:
-n提示哪些文件会被删除
-f删除当前目录下所有没有跟踪过的文件.它不会删除.gitignore文件里面指定的文件夹和文件
-f<path>删除指定目录下所有没有跟踪过的文件
-df删除当前目录下所有没有跟踪过的文件和文件夹
-xf删除当前目录下所有没有跟踪过的文件,包含.gitignore文件中设置的文件
Git 的常规操作流程:
创建版本库
先新建一个目录,然后通过 $ git init命令把这个目录变成Git可管理的仓库,例如: 在"C:\Users\Jeff\"路径下新建文件夹MyGit,然后在Git Bash里面进入该文件夹,输入命令 git init:
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
注意:首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。
添加文件到版本库
1、vi & vim 有两种工作模式:
(1) 命令模式:接受、执行 vi & vim 操作命令的模式,打开文件后的默认模式;
(2) 编辑模式:对打开的文件内容进行 增、删、改 操作的模式;
#在编辑模式下按下 ESC 键,回退到命令模式。
2、创建、打开文件:$ vi [filename]
1)使用 vim 加 文件路径(或文件名)的模式打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件,并在终端最下面一行显示打开的是一个新文件。
2)键盘输入字母 “i”或“Insert”键进入最常用的插入编辑模式。点i 进入编写状态;dd的删除整行;rm 文件名:删除指定文件
3、保存文件:
(1)在插入编辑模式下编辑文件。
(2)按下 “ESC” 键,退出编辑模式,切换到命令模式。
(3)在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vi 。
(4)如果只想保存文件,则键入":w",回车后底行会提示写入操作结果,并保持停留在命令模式。
4、放弃所有文件修改:
(1)放弃所有文件修改:按下 "ESC" 键进入命令模式,键入 ":q!" 回车后放弃修改并退出vi。
(2)放弃所有文件修改,但不退出 vi ,即回退到文件打开后最后一次保存操作的状态,继续进行文件操作:按下 "ESC" 键进入命令模式,键入 ":e!" ,回车后回到命令模式。
添加暂存区:
git add test01.py 对指定文件添加到暂存区
git add * 会忽略.gitignore把任何文件都添加到暂存区
git add . 会把本地所有文件都加入暂存区,并且会根据.gitignore做过滤
git add -A 也是提交所有文件(git add --all的缩写)
查看状态:
git status 查看状态
git 管理的文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
放入暂存区的文件为绿色显示,未放入暂存区的为红色显示;如下图
新建文件未放暂存区的状态:文件名为红色:
新建文件通过命令git add 文件名;放入暂存区;文件名为绿色;
已修改(modified);如下图
提交到本地git库:
git commit -m "注释信息"
查看历史记录信息:
git log 查看版本历史记录
git log --pretty=oneline 单行查看版本历史记录
git reflog 查看历史记录显示版本号(用于回滚)
回滚版本:
git reset --hard HEAD^ 回滚上一个版本 (用的不多)
git reset --hard 版本号 回滚到指定版本 (推荐使用这种)
比较工作目录下文件和本地仓库下文件的区别:
git diff 文件名
修改操作:
只在工作区修改:
1.1 改动不多,打开文件重新编辑,再提交到版本库
1.2 改动较多,git reflog 查看上一个版本的版本号, git reset --hard 版本号 (回退到指定版本)
1.3 使用命令 git checkout -- test02.py ,进行撤销操作,该命令的含义是表示拉取暂存区文件,并将其替换到工作区文件
修改提交到暂存区,然后想撤销 vi aa.py git add aa.py
2.1 文件已提交到暂存区,使用命令git reset HEAD 文件名:撤销暂存区的同步
2.2 使用git status 查看是否已撤销暂存区的同步
2.3 git checkout -- 文件名,已撤销到修改前的内容
修改已经提交到版本库了,这个时候想撤销:
3.1 通过git reflog 查看历史记录显示版本号(用于回滚)
3.2 利用 git reset --hard 版本号 回滚到指定版本
删除操作:
方式一:命令删除
1、 手动新增一个test03.py文件 内容为print(test03); vi test03.py
2、 使用git add test03.py、 git commit 提交到版本库
3、 通过命令git rm test03.py 进行删除操作;此操作会删除工作区的文件并同步到暂存区
4、 通过命令git commit 提交到版本库
备注:如果做到第三步,需撤销删除git reset HEAD test03.py ,再执行git checkout-- test03.py
方式二:手动删除
1、 手动新增一个test04.py 文件,内容为print(test04);vi test04.py
2、 使用git add * 、git commit 提交到版本库
3、 在工作区手动删除test04.py 文件;rm -rf test04.py
4、 使用命令git add -A 提交到暂存区的删除操作
5、 通过命令git commit 提交到版本库
备注:如果做到第三步,需撤销删除 git checkout – test04.py
重命名操作:
重命名操作和删除操作类似,也分为两种操作方式
方式一:命令重命名
1、 手动新增test06.py 文件,内容为print(test06); vi test06.py
2、 使用git add * 、git commit 提交到版本库
3、 通过命令git mv test06.py test07.py 进行重命名 ;其他操作系统可能是使用git ren
4、 再使用git commit 提交到版本库
备注:如果做到第三步需撤销重命名,git reset HEAD test06.py (不同步暂存区),再执行git checkout -- test06.py,此时test06.py回退到了工作区,但是test07.py文件也在,需要手动删除test07.py,使用命令git rm -r – cached test07.py(此时暂存区的test07.py文件不同步红色),再手动删除工作区rm -rf test07.py;
方式二:手动重命名
1、 手动新增一个test08.py文件,内容为print(test08); vi test08.py
2、 使用git add test08.py 、 git commit 提交到版本库
3、 在工作区手动重命名test08.py为test09.py;
4、 使用命令git add -A 重命名同步到暂存区(没执行命令前test08.py文件为待删除状态红色,test9.py文件为commited红色)
5、 再使用git commit 提交到版本库
备注:如果做到第三步需撤销重命名,可以通过命令git checkout -- test08.py找回,然后再工作区删除test09.py
修改最后一次提交操作(常用):
1、 手动增加一个test09.py文件,内容为print(test09);
2、 git add * 、git commit -m “提交test10文件” 提交到版本库
3、 使用git commit --amend -m “提交test09文件”,把最后一次提交的注释进行修改, --amend选项的commit命令(即git commit --amend )git 会更正最后一次的提交。
4、 在新增一个test10.py文件,内容为print(test10);
5、 使用git add * 命令提交到暂存区
6、 使用命令git commit --amend -m “提交test09.py/test10.py文件”也置入到最后一次提交的版本中(可通过git log --pretty=oneline)
备注:该操作是如果把提交的版本注释写错了或者漏提交别的文件,可通过--amend 命令修改最后一次提交的操作置入到一个版本中。
Git的分支管理
所谓的分支管理,其实就是利用git,对开发人员的分支进行管理,包含分支创建、分支合并、分支删除等操作
为了便于理解,先在master分支上做两个增量提交版本,操作如下:
1、手动新增一个new01.py文件,内容为print('new01')
2、使用git add *、git commit -m “第一次提交”进行提交
3、手动新增一个new02.py文件,内容为print('new02')
4、使用git add *、git commit -m “第二次提交”进行提交
一、创建分支:
1、 通过git branch 查看分支
2、 通过命令git branch dev 创建一个dev分支
3、 通过命令git checkout dev 切换到dev分支
备注: 步骤2、3可以通过命令git checkout -b dev 完成相同操作
二、新分支上提交并切换到master分支:
1、 通过git checkout dev 切换到dev分支上
2、 在new02.py文件进行修改,内容新增一行print(new022);
3、 使用git add * 、git commit -m “dev分支上第一次提交” 提交到版本库
4、 使用git log --pretty=oneline 查看git日志
5、 使用命令git checkout master 切换到master 分支上,此时发现new02.py文件的内容没有了,因为已经切换都master分支上了
三、把dev分支合并到master分支上
1、首先HEAD指针在master分支上
2、使用git merge dev 把dev分支上的内容合并到master分支上
3、当分支合并后,可以使用git branch -d dev 删除dev分支
备注:git merge 命令是用于合并指定分支到当前分支上,Fast-forward 表明这次合并是‘快进模式’也就是直接把master指向dev的当前提交,所以合并速度快(但有个弊端,参考第五步)
四、分支合并时的冲突
1、使用git checkout -b dev 创建并切换到dev分支上
2、对new02.py文件进行修改,添加一行内容print(dev),并提交到版本库
3、使用命令git checkout master 切换到master分支上,并对new02.py文件进行修改,添加内容print(master),并提交到版本库;
上面的情况git 无法进行快速合并,只能试图把各自的修改合并起来,但这种合并会有冲突
冲突原因:master分支和dev分支上都有新的提交,并且编辑了同一个文件
4、 使用命令git merge dev合并分支,此时git会提示冲突
5、 打开new02.py文件,显示<<<<<<<HEAD下面表示主分支做的修改;=======表示分割线;>>>>>>>dev上面表示dev分支做的修改;
6、 对new02.py文件进行编辑,把<<<<<<<HEAD、=======、>>>>>>>dev去掉,并由自己选择需要保存的内容
7、 再使用git add * 、git commit -m “冲突解决” 提交到版本库
五、分支合并时取消Fastforward模式:
1、FastForward意为"快进模式"。主要使用在多分支合并的情况下。即:当前分支合并另一个分支的时候,如果合并的过程中没有冲突的时候,则会通过直接移动两个分支的指针,来达到合并的过程,这个过程就叫做FastForward。在FastForward模式下,当我们合并分支后,将会删除无用的分支dev,在这种情况下,FastForward就有一个弊端暴露了,即:删除分支后,会丢掉分支的所有信息
2、在合并dev分支的时候,通过命令git merge --no-ff -m “禁用FastForward模式提交” dev可以强制禁用FastForward模式提交,然后再使用命令git log --graph --pretty=oneline --abbrev-commit查看日志即可看到分支信息
标签管理:
标签tag是某个提交commit的指针,一个提交可以有多个标签。标签方便后期回溯
常用操作:
git tag 标签名:对当前版本创建轻标签
git tag: 查询已创建标签
git show 标签名:展示标签名
git tag 标签名 -m“注释信息” 或 git tag -a 标签名 -m “注释信息”:打标签的时候增加附注标签信息,-a选项表示声明要打一个含附注的标签。
git tag -a 标签名 -m "备注信息" 版本号:针对指定的版本号打标签
git checkout 标签名:切换到指定标签,此时不位于任何分支,处于游离状态,可以考虑基于这个标签创建一个分支
git tag - d 标签名: 删除指定标签
git push origin 标签名:推送单个标签
git push origin --tags:推送本地所有标签
git push origin : refs/tags/标签名:远程删除指定标签
远程仓库:
远程仓库是指托管在因特网或其他网络中你的项目的版本库,有了远程仓库,就能与他人在任意git项目上进行协作开发;公司自己部署的远程仓库:github gitee
本地仓库连接远程仓库(github、gitee):
连接Github 操作:
Github优势:全球最大的代码托管平台;劣势:国内访问慢,美国的
1、 检查电脑上是否有公钥 ~/.ssh/id_rsa和id_rsa.pub,如果没有则进行git 的初始化配置: 建议配置成github或者gitee的注册的账号名称
git config --global user.name "yourname" # 配置个人用户名
git config --global user.email "youremail" #电子邮件地址
然后执行ssh-keygen -t rsa –C "youremail@example.com” ;其中生成的文件id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥;
2、 注册github 账号;打开网址:https://github.com/ ==> 注册账号
3、 在github配置SSHKe ;登录github账号==>Settings==>SSHKeys页面==>点击"Add SSH Key"==>填上任意title,在Key文本框里粘贴id_rsa.pub文件的内容
4、 在github上创建远程仓库
界面上右上角点击“New repository”创建一个新的仓库,填写Repository name(仓库名称,和本地仓库名称一致),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
5、 在本地仓库查看远程仓库连接 git remote ,如果没有创建远程仓库连接,进行第六步
6、 在本地仓库下设置连接:
git remote add github远程仓库git地址:添加远程仓库,名称为origin (默认可自定义)
git push github master:把master分支推送到github远程仓库;加入参数-u,以后即可直接用git push代替git push origin master该操作第一次提交需要输入github账号和密码
连接gitee操作:
gitee优势:和github功能几乎一致,国内的
1、检查电脑上是否有公钥 ~/.ssh/id_rsa和id_rsa.pub,如果没有则进行git 的初始化配置: 建议配置成github或者gitee的注册的账号名称
git config --global user.name "yourname" # 配置个人用户名
git config --global user.email "youremail" #电子邮件地址
然后执行ssh-keygen -t rsa –C "youremail@example.com” ;其中生成的文件id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥;
2、注册gitee 账号;打开网址:https://gitee.com/ ==> 注册账号
3、在gitee上配置公钥
设置—SSH公钥—在Key文本框里粘贴id_rsa.pub公钥文件的内容
4、在gitee上创建远程仓库
点击界面右上角 + 号--->新建仓库--->填写仓库名称,和本地仓库名称一致,路径也一样;可选择开源或私有;其他保持默认设置,点击“创建”按钮,就成功地创建了一个新的Git仓库
6、 在本地仓库下设置连接:
git remote add gitee 远程仓库git地址:添加远程仓库,名称为origin (默认可自定义)
git push gitee master:把master分支推送到gitee远程仓库;加入参数-u,以后即可直接用git push代替git push origin master该操作第一次提交需要输入github账号和密码
克隆代码到本地仓库:
1、 切换到放置克隆代码的项目路径 cd ..
2、 在gitee 上点击克隆下载,复制代码克隆的路径
3、 git clone 克隆的地址(备注:克隆下来的代码需要提交的话默认有origin远程仓库,如果需要更换 git remote rename origin 新远程仓库名称 或 git remote remove(删除默认的远程仓库,再重新设置连接))
fork操作:用的不多
拷贝开源项目、并自己修改完成后,可以pull request给原作者,原作者可以是否同意合并修改部分
1、进入你想fork项目的github主页面,点击fork操作,此时你的github就会出现源项目
2、通过git clone命令把项目克隆到本地仓库
3、在该fork项目的本地仓库中新建一个分支,不建议直接修改master分支
4、在该分支上进行操作后,合并到本地仓库的master仓库
5、使用git push命令把改动同步到自己的Github仓库中
6、点击自己的仓库中的pull request下的New pullrequest,之后github会自动对比原仓库分支与自己仓库分支代码,看看是否有冲突。如果它显示Ableto merge的话,就可以点击Create pull request按钮,进行提交。
7、在注释页面添加注释,跟原作者说明改动了什么,以及改的原因等
8、点击Create pull request后,原作者就会收到pull request,原作者如果同意合并操作,就完成了对项目的贡献
多人协作:
1、 进入自己的项目仓库,点击仓库---仓库成员管理---所有—添加仓库成员
2、 仓库成员 克隆代码到本地,可以修改项目代码到远程仓库
远程仓库多人协作下解决冲突:
冲突产生原因:当远程仓库在多人协作的模式下,会出现多个协作者提交相同代码文件的情况,比较后提交的代码文件会提示代码冲突
代码冲突操作步骤:
1、完成远程仓库多人协作操作配置
2、A、B两个账号都克隆项目到本地
3、A账号修改一个文件,如test.py文件,并提交到远程仓库
4、B账号也修改相同的test.py文件,并提交到远程仓库
5、此时出现代码冲突
解决冲突操作步骤:
方式一:
1、使用git pull命令把最新的提交拉取下来
2、如果拉取失败一般原因是没有指定本地子分支与远程origin/子分支的链接:可使用该命令git branch --set-upstream-to=origin/远程子分支本地子分支
3、此时pull虽然成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样
4、解决完成之后,使用git push提交
方式二:
使用命令git push -f强制提交,该方式会导致远程仓库之前的修改被覆盖,同时提交日志也会被覆盖
Git +pycharm实战:
在公司里面,一般不常用git命令直接进行操作,而是通过 编码的IDE工具集成了git操作(pycharm)
Pycharm+ Git 的配置
1、 打开pycharm ---setting---Version Control---Git
2、 创建版本仓库(同git init操作一样)
3、 添加忽略文件.gitignore—保存到本地仓库
4、 添加到远程仓库
4.1 在gitee上新建一个同名仓库
4.2 进入如下图的功能git push 进行上传
5、查看gitee上的仓库上传成功
Pycharm+ Git 的操作:
1、 git push 上传,git pull 下载
2、 每次增加或修改一个文件都要git add ,git commit 提交到本地版本库
3、 pycharm 中对添加到暂存区的文件如何撤销
右击文件 git rollback 返回上一步(window操作)
右击文件 git revert 返回上一步(mac操作)
4、 pycharm 中对添加到本地版本库的文件如何撤销
右击文件 show History ---右击 Revert Commit
5、 pycharm如何创建分支、合并分支
1.创建分支:右击文件--- Git --- Branchs --- New Branch --- 分支名称
2.合并分支:右击文件 --- Git ---Branchs—切换到master分支上(checkout)---再右击文件 --- Git ---Branchs --- 点击指定的分支 --- Merge info Current
6、 pycharm中如何给分支创建标签:
右击文件 --- Git ---Sow History --- 对指定的分支右击 ---New Tag