赞
踩
该文为学习 廖雪峰 Git 教程 整理的笔记
安装完git后需要设置用户名和email地址,后续git提交会使用到该用户信息,鼠标右键点击 Git Bash Here
,输入以下命令:
git config --global user.name "xxx"
git config --global user.email "xx@xx.xx"
效果展示:
在该文件夹下鼠标右键点击 Git Bash Here
,输入以下命令:
git init
效果展示:
在这之前,需要该文件夹里面有文件,可以创建一个 readme.txt 文件(文件名、文件内容任意)
git add readme.txt
也可添加多个文件:
git add readme.txt readme2.txt
添加该目录下的所有文件(如果文件被添加过了,就添加新文件或被修改的文件):
git add *
或
git add .
效果展示:
git commit -m "对本次提交的说明"
效果展示:
为什么需要 add
、commit
说明:add
用于将文件添加到一个暂存区(临时保存你的改动),此时还未真正提交,使用commit
以实现真正的提交改动
查看修改的文件信息(此处修改了 readme.txt 和 readme2.txt 两个文件):
git status
效果展示:
查看修改的文件内容(此处分别在两个文件中追加了 abc 字符):
git diff
效果展示:
撤回文件修改(注:此时还未执行 git add 文件名
命令,该文件此时还未放入暂存区中):
git restore 文件名
或
git checkout -- 文件名
额外作用: git checkout -- 文件名
(注:执行了 git add 文件名
命令后,已将文件放入了暂存区,此时又对该文件进行了修改,可用该命令撤回文件修改,撤回的是放入暂存区后的修改)
效果展示:
修改文件后,再次进行提交:
git add readme2.txt
git commit -m "追加了abc字符串"
git log
简化输出的内容:
git log --pretty=oneline
效果展示:
git reset --hard head^
效果展示:
参数说明:
head
:head 表示当前版本,则上一个版本表示为 head^
,以此类推,上上一个版本为 head^^
,也可表示为 head~2
此前,我们通过 git reset --hard head^
命令回退到了上一个版本(参考7),现在,我们后悔了,想要撤回刚刚的回退,可以通过指定 commit id
来回退指定位置,注意:commit id
要根据自己的实际来填写,此处我的 commit id
为 fa0e
git reset --hard fa0e
效果展示:
参数说明:
fa0e
:该参数为想要回退的版本的 commit id
的前4位,无需全部填写,git会自动查找
忘记了 commit id
怎么办,可以通过 git reflog
命令来查看你的历史命令
git reflog
效果展示:
$ git reflog
fa0ec7f (HEAD -> master) HEAD@{0}: reset: moving to fa0e (1)
ffe9908 HEAD@{1}: reset: moving to head^ (2)
fa0ec7f (HEAD -> master) HEAD@{2}: commit: 追加了abc字符串 (3)
ffe9908 HEAD@{3}: commit: 这是一次提交测试1 (4)
564a0d0 HEAD@{4}: commit (initial): 这是一次提交测试 (5)
(1):该命令为执行 git reset --hard fa0e
后的结果,它提示我们移动到了 fa0e
(2):该命令为执行 git reset --hard head^
后的结果(参考7),实际上就是从 fa0ec7f
(3) 回退到了 ffe9908
(4)
(3)~(5):为历史提交的记录,前面的字符串即为 commit id
最后,可以通过 git log
命令再次查看当前版本库状态,图片显示已成功回退
(情况1): 假如修改了 readme.txt 文件,保存完退出后,后悔了,想要撤回刚刚的修改,回到之前未修改的状态:
git restore 文件名
或
git checkout -- 文件名
(情况2): 假如修改了 readme.txt 文件,保存完退出后,执行了 git add readme.txt
命令,此时文件被放到了暂存区,之后又打开了 readme.txt 文件,又进行了修改,保存完退出后,后悔了,想撤回刚刚的修改:
git checkout -- 文件名
注意:此时撤回的是第二次的修改,该命令无法撤回 git add
命令前的修改
(情况3): 假如修改了 readme.txt 文件,保存完退出后,执行了 git add readme.txt
命令,此时文件被放到了暂存区,后悔了,想要撤回修改:
git reset head 文件名
该命令相当于撤回刚刚执行的 git add readme.txt
命令
现在,想要撤回修改,还需要执行:
git checkout -- 文件名
(情况4): 假如修改了 readme.txt 文件,保存完退出后,执行了 git add readme.txt
命令,还执行了 git commit -m 提交说明
命令,想要撤回修改:
git reset --hard commit-id号
在这之前,如果不知道 commit-id号
,可以先执行 git reflog
命令查看历史git命令,每行最前面显示的字符串即为 commit-id号
(参考8)
假如我们执行了 git add
命令,将文件 readme.txt
添加到了暂存区,并且执行了 git commit
命令将文件都提交到了版本库中,现在,不小心删除了文件,现在执行 git status
查看状态:
效果展示:
可以通过命令撤回刚刚的删除:
git checkout -- readme.txt
如果我们就是想要删除该文件,需要执行:
git rm readme.txt
git commit -m "删除了readme.txt文件"
通过git命令删除后,还需要使用 git commit
命令进行提交
效果展示:
注意:如果文件从未提交到版本库(git commit
),则无法通过以上命令恢复
1、注册登录后,右上角点击新建仓库
2、填写信息
3、创建 ssh 密钥:
ssh-keygen -t rsa -C "注册时的邮箱"
查看 ssh 密钥:
cat ~/.ssh/id_rsa.pub
在Gitee上进行配置:
验证连接情况(注意:杀毒软件可能出现拦截,如火绒):
ssh -T git@gitee.com
效果展示:
详情链接(转载):https://help.gitee.com/base/account/SSH公钥设置
1、复制仓库地址
2、添加远程仓库地址,在本地文件夹下运行命令:
(注意:将 git@gitee.com:xxx/backup-data.git
替换成刚刚自己复制的仓库地址)
git remote add origin git@gitee.com:xxx/backup-data.git
参数说明:
origin
:该参数为远程仓库的名称,可自行更改
效果展示:
3、将本地提交推送至远程仓库
git push -u origin master
参数说明:
origin
:该参数为远程仓库的名称,如果刚刚添加了多个仓库,此时就可以通过更改名称将文件推送到指定仓库
master
:推送的分支
1、可以先查看连接的远程仓库信息
git remote -v
效果展示:
2、现在想要解除与某个远程仓库的连接
git remote rm origin
或
git remote remove origin
参数说明:
origin
:该参数为远程仓库的名称,应根据自身实际填写
效果展示:
1、获取远程仓库地址
2、克隆远程仓库至本地,使用此方法,只要输入对方的远程仓库地址(前提是对方的仓库是公开的),方可将目标文件克隆至本地
如果是在自己的电脑上克隆,配置了ssh密钥,可使用此方式,当然,如果你的小伙伴也想用这种方式克隆,那他就必须在自己的电脑上生成一个ssh密钥,然后再让他把这个密钥发给你一份,在gitee上配置权限 (参考11 最后的ssh密钥配置部分)
git clone git@gitee.com:xxx/backup-data.git
如果你只是刚刚安装完git,只知道对方的仓库地址(http格式),要想克隆,则使用以下方法,比如你在GitHub上浏览别人的项目时,想要克隆一个别人的项目到自己的电脑,只需要复制对方的仓库地址(http格式)即可克隆下来:
git clone https://gitee.com/xxx/NodeJsNotes.git
效果展示:
在虚拟机上的CentOS 7安装git来模拟另一个团队成员(小明)与我的协同开发。
CentOS 7系统安装git:
进入root:
su root
yum install git
卸载:
yum remove git
安装命令参考:https://git-scm.com/download/linux
1、配置用户信息:
git config --global user.name "CentOS_L"
git config --global user.email "CentOS_L@qq.com"
2、创建 ssh 密钥(参考11):
ssh-keygen -t rsa -C "CentOS_L@qq.com"
查看 ssh 密钥:
cat ~/.ssh/id_rsa.pub
验证连接:
ssh -T git@gitee.com
生成ssh密钥后,且验证连接显示成功后,小明将密钥发给我,我将在Gitee上进行密钥的配置:
现在,我在桌面新建了一个 test 文件夹,添加了一个 test.txt
文件(写入任意内容,此处我写入 123
),并执行如下命令:
git init
git add .
git commit -m "win10系统下的master分支提交了一个test.txt文件"
建立与远程仓库的连接:
git remote add origin git@gitee.com:xxx/backup-data.git
将文件推送至远程仓库:
git push origin master
查看远程仓库内的文件:
我们成功将win10系统上的文件推送至远程仓库了,现在,小明(CentOS 7)想要克隆这些文件,当然,我们得把远程仓库的地址告诉小明,由于我们在Gitee上也配置了小明的密钥,所以小明可以使用ssh方式克隆,即便仓库是私有的,如果没有配置ssh密钥,想要克隆,只能填写http地址的方式克隆,而且对方的仓库必须是公开的。
我们的远程仓库地址为:git@gitee.com:xxx/backup-data.git
(根据自身实际填写)
小明(CentOS 7)执行如下命令克隆:
git clone git@gitee.com:xxx/backup-data.git
查看克隆情况:
现在,我们回到win10系统,创建一个 dev
分支:
git switch -c dev
我们在文件夹内创建一个 readme.txt
文件:
我们做完这些后,把这个 dev
分支推送至远程仓库,执行如下命令:
git add .
git commit -m "在win10系统下的dev分支添加了一个readme.txt文件"
将 dev
分支推送至远程仓库:
git push origin dev
现在,小明(CentOS 7)也想要 dev
分支中的内容,难道要重新克隆一份吗?并不需要
小明需要先进入克隆下来的文件夹,右键点击进入终端执行命令。
当我尝试执行命令 git checkout -b dev origin/dev
时,遇到了一个错误:
之所以报错,是因为小明在CentOS 7上先克隆了仓库,在这之后,我在win10系统上才推送了 dev
分支到远程仓库,所以小明的系统上没有得到及时更新,所以无法切换,现在,让小明先同步一下更新:
git fetch origin
再次执行:
git checkout -b dev origin/dev
命令说明:该命令表示为创建并切换至 dev
分支,参数 origin/dev
表示为将刚刚创建的 dev
分支与远程仓库(origin)的 dev
分支关联起来
问:为什么不用 git switch -c
命令来创建切换?答:可能因为git版本的问题,git switch
在此无法使用。
现在,小明修改了 readme.txt
文件,并进行了推送:
可能需要修改一下文件的只读权限:
sudo chmod a+w readme.txt
提交至版本库:
git add .
git commit -m "小明-CentOS 7上修改了readme.txt文件"
推送至远程仓库:
git push origin dev
远程仓库查看:
现在,我也修改了 readme.txt
文件,并尝试进行推送:
git add .
git commit -m "在win10系统下修改了readme.txt文件"
修改的内容:
git push origin dev
推送失败:
由于小明推送到远程仓库的内容与我推送上去的内容存在冲突(小明修改文件的内容为 123
,而我修改的内容为 456
,所以存在冲突),所以推送失败,它提示我们在推送之前先 git pull
:
git pull
拉去失败,它提示我们没有指定与远程连接的关联,也就是需要将本地的 dev
分支与远程仓库的 dev
进行关联:
将参数 <branch>
替换成远程需要关联的分支即可,参数dev
则为本地需要关联的分支。
git branch --set-upstream-to=origin/dev dev
git pull
打开冲突文件,手动解决冲突:
我们保留想要推送的内容:
手动解决冲突后,我们执行以下命令,再次推送:
git add .
git commit -m "win10系统上手动解决了冲突"
git push origin dev
推送成功:
查看远程仓库的内容:
在小明的系统上更新最新的提交:
git pull
也许我们可以理解为,你和你的团队在共同开发一个项目,这是主分支 master(默认分支),现在,有一个特定的模块只有你能完成,但是你开发这个模块需要很多时间,而且还需要进行相关的测试,如果此刻你将你那未完成的代码提交到了主分支(master),被其他成员克隆至本地后,这部分未完成的代码很有可能会使程序出现问题,对整体项目的开发造成影响。此时,我们就需要用到分支了,你可以创建属于自己的分支,你可以在自己的分支上进行任意的提交,也不会影响到主线任务,直至你将你的模块开发完毕,并经过测试后,再将这个分支合并到主分支(master)
git checkout -b dev
或
git switch -c dev
参数说明:
-b
:表示创建并切换至 dev
分支
dev
:dev
为我们的分支名称,可自行更改
checkout
、switch
:用于切换分支,也可以切换回主分支 git checkout master
或 git switch master
效果展示:
git branch
效果展示:
刚刚我们将分支切换到了dev,现在,可以在文件夹内创建一个 test.txt 文件(文件名、文件内容任意),并依次执行以下命令:
git add test.txt
git commit -m "在dev分支下创建了一个test.txt文件"
效果展示:
现在,让我们把分支切换回主分支(master):
git checkout master
效果展示:
可以观察到,test.txt文件不见了。同样的,对文件的修改、删除也具有相同的效果,不过记得执行 git add
和 git commit
命令。
现在,让我们将 dev
这个分支合并到主分支(master),这样,我们在 master
分支上就能看到 test.txt 文件了。git merge
:合并指定分支到当前分支
git merge dev
效果展示:
删除 dev
分支:
git branch -d dev
它可能会提示删除失败,分支还未合并,强制删除:
git branch -D dev
(情况1): 不同分支下修改同一文件的同一行内容导致的冲突
假设,现在我们有两个分支(dev
和 master
),且分别有一个空文件 test.txt
在 dev
分支下:在 test.txt
文件中输入了 123
,之后提交至版本库(git add
-> git commit
)
现在,让我们切换至 master
分支,由于之前是在分支内操作的,并且还未合并,所以此时 master
分支下的 test.txt
文件也是空的。
在 master
分支下:在 test.txt
文件中输入 abc
,并提交至版本库
之后执行合并命令:git merge dev
显示自动合并失败:
现在,我们需要手动来解决冲突了,因为两个文件都在同一行写了不同的内容,git 不知道合并之后该听谁的(dev
分支下的test.txt 还是 master
分支下的 test.txt),所以它无法自动进行合并了。
现在,让我们打开 test.txt 文件来手动解决冲突,自行选择需要保留的内容:
在此,我们选择保留 master
分支上的内容,删除 dev
上的内容,修改后保存退出:
之后再次执行:
git add test.txt
git commit -m "解决合并冲突"
效果展示:
(情况2):在某个分支下删除了一个文件,合并后文件消失
为了更好的说明,现在,我在桌面创建了一个 test 文件夹,在该文件夹下创建了一个 test.txt
文件,之后执行如下命令:
git init
git add *
git commit -m "在master分支下提交了test.txt文件"
之后创建并切换至 dev
分支:
git switch -c dev
现在,在 dev
分支下删除 test.txt
文件,并执行:
git rm test.txt
git commit -m "在dev分支下删除了test.txt文件"
切换回 master
分支进行合并:
git switch master
git merge dev
合并后发现 test.txt
文件消失了。
如果此时,你想恢复该文件,则需要执行:
在这之前可以使用 git reflog
命令查看 commit-id
:
git reset --hard c19b263
相当于撤回了刚刚的合并,回到了合并前的状态,此处的 c19b263
为我提交时的commit-id
需根据自身实际填写
效果展示:(git-log
别名配置详见 错误整理->4、为命令配置别名)
应用场景:在开发项目的过程中,我们一般遇到bug时,都会创建一个临时分支,在这个临时分支上进行修复,修复完成后,再进行合并,最后把这个临时分支删除。
现在,项目出现了bug,需要紧急修复,但是我们手头上的任务还未完成,不方便提交,但是我们此时需要创建一个临时分支来修复,怎么办?
也许,会有疑问,那不提交当前分支的内容,直接创建并切换到一个临时分支是否可行?
让我们尝试一下,假设我们刚刚在 master
分支下修改了一个 test.txt
文件,但是还未提交到版本库:
现在,我们尝试创建并切换分支,创建的分支名称为 bug001
:
git switch -c bug001
效果展示:
在创建并切换分支之前,我们查看状态后发现当前分支下(master
)有一个修改了的文件(test.txt
),并且它还未提交到版本库当中。
执行命令后,我们成功创建并切换了分支,但是查看状态后发现,刚刚 master
分支下未提交的文件还在,很明显,这个方法行不通了,那如果我们切换到一个已经存在的分支是否可行?
尝试切换到一个已存在的分支(假设我们之前创建过一个分支 dev
):
git switch dev
效果展示:
切换失败了,它提示我们切换分支之前提交更改或将其隐藏起来,我们知道,现在不能把未完成的工作进行提交,但是,隐藏是什么,如何做?它的作用是将当前的工作目录隐藏起来
git stash
效果展示:
通过图片我们观察到,隐藏后它提示我们没有需要提交的文件,并且已经可以切换分支了,后续便是创建并切换到一个临时分支,在临时分支上进行bug的修复,提交,合并,最后删除临时分支。
修复完bug后,我们还需要进行刚刚未完成的任务,怎么显示刚刚被隐藏的内容:
查看被隐藏的工作区位置:
git stash list
效果展示:
恢复工作区,该方法不会删除隐藏的内容:
git stash apply stash@{0}
参数说明:
stash@{0}
:隐藏的工作区编号,可以通过 git stash list
命令查看编号,如下图:
恢复后删除隐藏的内容:
git stash pop
1、合并完,删除分支后,依然可以保留分支信息
git merge --no-ff -m "描述信息" dev
2、复制特定的提交到当前分支
应用场景:在 master
分支下创建并切换了一个新的分支 dev
,master
分支下提交过的文件(test.txt
),dev
分支下同样也有一份,现在,master
分支下修复了文件出现的bug(test.txt
),并进行了提交,既然master
分支下的文件有bug,那 dev
分支下相同的文件也一定存在bug,怎么办,在 dev
分支下再修复一次?不需要,我们只要知道 master
分支修复时提交的 commid-id号
即可,再通过 cherry-pick
相关命令,即可将 master
分支下修复的操作再现一遍,这样我们在dev
分支下的bug也就被修复了。commid-id号
可以通过命令 git reflog
查看:
git cherry-pick commid-id号
3、强行删除一个未合并的分支
git branch -D 分支的名称
原因:远程仓库与本地仓库不一致,远程仓库推送过文件,但是手动删除了,此时远程仓库里面并没有文件
解决:清空远程仓库,再次推送(此方法只适用于远程仓库曾手动删除了所有文件的情况)
当我们执行 git reflog
命令时,可能会出现如下图的情况,按 esc
也无法退出,此时,只要键盘按 q
或 wq
即可退出,只要想退出了,都可以直接退出,无需出现图片中的 (END)
符号。
方法一:鼠标选中即可复制,按下鼠标中键即可粘贴
方法二:键盘快捷键
复制:ctrl
+ ins
粘贴:shift
+ ins
ins
键如图:(图片来源于 104键键盘布局高清示意图)
查看分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
命令太长了,不容易记,我们可以为该命令配置别名,执行以下命令,将会在 C盘\用户\asus
(路径可能不同,应根据自身实际查找)路径下创建一个 .bashrc
文件:
touch ~/.bashrc
在此,我们将刚刚的命令起别名为 git-log
:
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
之后,执行以下命令即可:
source ~/.bashrc
其他设置别名方法:
git config --global alias.st status
删除别名:
git config --global --unset alias.st
git设置和删除命令别名的方法(转载):https://segmentfault.com/a/1190000020894321
在虚拟机上配置完ssh密钥后,测试连接显示失败:
原因:它提示是否要继续连接,但是直接回车是不行的,必须输入 yes
才能连接:
1、先删除本地仓库的分支
git branch -d dev
可能会删除失败,它会提示你还未合并,强制删除:
git branch -D dev
2、删除远程仓库的分支
git push origin --delete dev
参考链接(转载):https://blog.csdn.net/qq_20042935/article/details/107222147
详情请见:https://help.gitee.com/questions/Gitee产品配额说明#社区版个人用户
报错截图:
执行以下命令强制合并后再推送:
git pull origin master --allow-unrelated-historie
参考链接(转载):https://cloud.tencent.com/developer/article/1640651
1、图形化界面
gitk
2、设置git的输出为彩色
git config color.ui true
3、为分支打标签
git tag 标签名称
查看标签:
git tag
删除标签:
git tag -d 标签名称
假设,现在你刚刚安装完git,需要推送一个本地文件夹内的所有文件到远程仓库(已建好,并且已配置好ssh密钥,如何配置(参考11)),远程仓库地址为(git@gitee.com:xxx/backup-data.git
)
进入目标文件夹,执行以下命令:
git init
git config --global user.name "L"
git config --global user.email "L@qq.com"
git remote add origin git@gitee.com:xxx/backup-data.git
git add .
git commit -m "提交说明"
git push origin master
每次修改完文件或添加了新文件,只需要执行上述命令的最后3条即可推送至远程仓库。适用于只是想要备份文件的场景。
当然,如果你的仓库设置为公开的,你的小伙伴也下载了git,他也想要你仓库中的文件,怎么做?你需要告诉他你仓库的地址(http格式),之后他只需要执行以下命令即可:
git clone https://gitee.com/xxx/backup-data.git
本文为学习git时所记录的笔记,主要通过 廖雪峰的Git教程 进行学习,记录了一些常用的命令,以及自己在学习过程中遇到的问题,记录的方式主要以 命令+个人理解+命令运行截图为主,图片较多,个人认为如果附上运行结果可能对初学者较为友好,我也希望自己在学习的时候也能遇到图文并茂的教程,一方面如果只有文字和命令有些时候或许不太直观,看多了也容易疲惫,另一方面初学者可能会因为不确定执行完命令是否正确而纠结,文中对一些概念的理解可能也会存在一些表述不准确的地方,还望指正,也希望读者能从中获得帮助。
本文主要记录git的基本使用,当然,相关的命令并不止这些,这只是一小部分,且命令涉及的原理并没有进行相关说明,想要了解更多详见 (参考链接)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。