Git的使用
Git的使用
配置Git-SSH
- 在Windows下打开Git Bash
- 输入
ssh-keygen -t rsa -C "注册邮箱"
- 输入
start ~/.ssh/id_rsa.pub
也可直直接在C/用户主目录/.ssh/中找到id_rsa.pub文件。 - 记事本打开id_rsa.pub文件,里面的内容就是ssh key。
- 登陆Git,打开"SSH Keys"页面,把上一步中文件夹中的所有内容复制,点击Add即可。 https://github.com/settings/keys
创建版本库
- 创建一个新目录两种方式:
1)直接电脑创建文件夹:在任意地方新建文件夹后,右键选择GitBush Here.
2)Git命令创建如下所示:
pwd
:查看所在地址,如果想在其他位置创建就像执行,例如:cd D:
就是在D盘。 - 通过
git init
命令把这个目录变成Git可以管理的仓库。
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件。 - 在文件夹中新建一个记事本随便命名。xx.txt
git add xx.txt
命令 告诉Git,把文件添加到版本库git commit -m "添加了一个记事本文件"
其中git commit
命令是告诉Git,把文件提交到仓库,-m
后面输入的是本次提交的说明,可以输入任何内容
git commit命令执行成功后会告诉你,1个文件被改动(xx.txt文件),插入了两行内容(xx.txt有两行内容)。
版本退回
git log
命令显示从最近到最远的提交日志,如果感觉显示的信息过多可以输入git log --pretty=oneline
这样只会显示版本号和提交说明。如图所示:
- 如果我们要回退到上一个版本,命令就是
git reset --hard HEAD^
在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。 - 如果我们对上面的操作后悔,在窗口还没有关闭的情况下我们可以向上找到我们想回到的版本的
commit id
也就是3628164...882e1e0
。我们要输入的命令如下:
git reset --hard 3628164
。 版本号不需要写全前几位即可。
cat xx.txt
查看文本内容。 - 如果已经关闭窗口或者已经重启电脑,我们可以执行以下命令:
git reflog
查看历史命令如下所示:
我们就可已通过git reset --hard commit id
来找回想回到的版本
工作区和暂存区
- 我们现在xx.txt中添加点内容
- 在工作区新建一个记事本xxx.txt,并添加一点内容
- 使用
git status
命令。 - 文件夹名会是红色,并且会告诉我们xx文件夹被修改了,xxx文件夹
Untracked
还没被添加。 - 使用两次
git add
, git status
再次查看 ,文件夹名会变成绿色。- 整体操作如图所示:
- 这个操作会让我们的两个文件夹存放在暂存区,我们还需要执行一步,把文件提交到分支如下:
git commit -m "更待xx文件夹,新添加xxx文件夹"
- 我们再执行
git status
会显示nothing。表示我们没有在对工作区做修改。如图所示:
- 整体流程图:
管理修改
- 只能先
git add
之后的才能经过git commit
提交到分支上。 - 只要对某个文件进行修改,修改后都要
git add
一下在提交。 git diff HAED -- xx.txt
命令:可以查看工作区和版本库里面的最新版本的区别。
撤销修改
- 共有三种情况:
1)修改了内容,但是没有添加到暂存区也就是没有执行git add
命令。
可以直接使用git checkout -- xx.txt
。文件就被还原到修改前的内容。
2)修改了内容并且执行了git add
但是没有提交,也就是没有执行git commit
命令。
可以使用git reset HEAD xx.txt
把文件从暂存区的修改退回到工作区,也就是执行git add
命令之前。
在使用git checkout -- xx.txt
。文件就被还原到修改前的内容。
3)修改了内容并且执行了git commit
命令也就是提交了。
我们可以使用回退版本库,git reflog
查看历史提交操作。找到之前的版本使用git reset --hard commitid
。就回到了上次提交的版本了。
(!!!!!这个操作的前提是还没有将本地的版本库提交到远程库上)
删除文件
git rm xx.txt
删除文件git commit
提交到分支
添加远程库
- 选中将要远程的文件夹右键,点击Git Bash Here。
- 输入
Git init
- 输入
git add 项目文件夹名
- 输入
git commit -m ""
- 登陆Git官网Git
- New repository,起一个项目名字,其他默认设置。点击Create即可。如图所示:
- 目前GitHub上的这个仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。如图所示:
- 接下来我们与本地仓库关联,我们可以直接从上图中圈出的地方复制,在命令版界面粘贴,也可以手写命令如下:
git remote add origin git@github.com:自己的账号名/文件名(步骤5中起的).git
- 把本地库的所有内容推送到远程库上(如果用的复制直接在上一步就复制的是两步直接敲回车即可)手写如下:
git push -u origin master
这样我们就把我们的项目推送到GitHub上了,如图所示:
- 使用命令
git push -u origin master
第一次推送master
分支的所有内容; - 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改;
从远程库克隆
- 新建一个文件夹,右键GitBashHere
- 在GitHub官网找到要克隆的项目,在项目的界面点击克隆或下载,复制其ssh key。如图所示:
- 输入
git clone 粘贴刚刚复制的内容也可以手写
。 - 如果成功克隆如图所示:
(文件夹中也会出现项目) cd 项目名
ls
会显示其中所有的内容
创建与合并分支
git checkout -b fz
创建一个分支,然后切换到该分支。
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
git branch fz
git checkout fz
git branch
命令查看当前分支。
git branch
命令会列出所有分支,当前分支前面会标一个*
号。- 对xx.txt做个修改。
git add xx.txt
git commit -m "修改了xx.txt"
fz
分支的工作完成,我们切换回master
分支:git checkout master
注意:切换回master
分支之后,我们查看xx.txt文件,刚刚对文件进行的修改不见了。因此,我们要把分支的工作成果合并到master
分支上如下:git merge fz
git merge
命令用于合并指定分支到当前分支。合并后,再查看xx.txt的内容,就可以看到,和fz
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向fz
的当前提交,所以合并速度非常快。
8. 合并完成后我们就可以删除fz分支了 git branch -d dev
9. git branch
删除后再次查看branch
,就只剩下master
分支了
10. 整体操作如图:
解决冲突
- 创建并切换分支
- 对文件进行修改,添加,提交
- 切换到master分支
- 对文再次件进行修改,添加,提交
- 合并,在这里会出错!!
- 查看状态,也可以在文件夹中直接查看,文件中查看的情况如图Case diagram所示:
- 对文件再次进行修改,添加,提交
- 用带参数的git log也可以看到分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
- 删除分支
- 整体操作图如下:
分支管理
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
--no-ff
方式的git merge
:
- 在实战开发时我们团队的分支就如图所示:
Bug分支
在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
- 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
- 幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
git stash
- 用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支: - 修复bug
- 修复完成后,切换到master分支,并完成合并,最后删除issue-101分支。
- 切换到fz,在执行一次
git stash
git stash list
查看我们之前的工作区存放的位置- 恢复两种办法:
a.用git stash apply
.但是恢复后,stash内容并不删除,你需要用git stash drop
来删除
b.git stash pop
- 你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
- !!!这个分支我们需要强行删除
git branch -D feature-vulcan
多人协作
- 推送分支
a.推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
git push origin master
b.如果要推送其他分支,比如dev,就改成:
git push origin dev
但是,并不是一定要把本地分支往远程推送
-
master
分支是主分支,因此要时刻与远程同步; -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug
分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug; -
feature
分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
更新远程代码到本地仓库
- 方法1
$git fetch origin master
//从远程的origin仓库的master分支下载代码到本地的origin master
$ git log -p master.. origin/master//
比较本地的仓库和远程参考的区别
$ git merge origin/master
把远程下载下来的代码合并到本地仓库,远程的和本地的合并
2. 方法2
直接使用git pull
命令
命令归总
文件名:例如xx.txt
- 退回上一个版本库:
git reset --hard HEAD^
- 退回上100个版本库:
git reset --hard HEAD~100
- 退回指定版本库:
git reset --hard commit_ID
- 查看提交历史:
git log
- 查看历史命令:
git reflog
- 查看文件内容:
cat 文件名
- 查看状态:
git status
- 提交:
git commit -m "备注"
- 添加:
git add 文件名
- 查看工作区与版本库的最新区别:
git diff HEAD -- 文件名
- 撤回对工作区的修改:
git checkout -- 文件名
- 撤回对暂存区的修改:
git reset HEAD 文件名
- 从版本库中删除文件:
git rm 文件名
- 恢复文件到最新版本:
git checkout -- 文件名
- 关联远程库:
git remote add origin git@server-name:path/repo-name.git
- 第一次推送分支:
git push -u origin master
- 推送分支:
git push origin master
- 查看分支:
git branch
- 创建分支:
git branch <name>
- 切换分支:
git checkout <name>
- 创建+切换分支:
git checkout -b <name>
- 合并某分支到当前分支:
git merge <name>
- 删除分支:
git branch -d <name>
- 查看分支合并情况:
git log --graph --pretty=oneline --abbrev-commit
- 合并分支并禁
Fast forward
😒 git merge --no-ff -m "备注" - 查看分支存放的位置:
git stash list
- 恢复存放在stash的分支:
a.git stash apply
但是恢复后,stash内容并不删除git stash drop
删除
b.git stash pop
恢复的同时把stash内容也删 - 恢复指定的stash:
git stash apply stash@{0}
- 强制删除:
git branch -D <name>
Git学习分享
陈嘉栋:https://github.com/chenjd/my-git
廖雪峰:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
本作品由A_AiTing采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。