GIT——基本操作
一、配置用户名和邮箱
-
告诉git你是谁
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
-
如果没有配置的话,在提交文件时,会报错
二、创建版本库
在创建的文件夹中鼠标右键 “Git Bash Here”,即可在当前文件夹中打开Git
-
创建 learngit 文件夹
打开 learngit 文件夹
浏览当前文件夹$ mkdir learngit $ cd learngit $ pwd
-
将这个目录变成Git可以管理的仓库
$ git init
-
将文件夹(工作区)下的readme.txt放置在暂存区
$ git add readme.txt
-
将暂存区的readme.txt放置到当前分支
$ git commit -m "wrote a readme file"
三、版本回退
-
多次提交修改后的readme.txt文件
-
查看版本历史记录
- 详细记录
$ git log
- 简略记录
$ git log --pretty=oneline
注:57af97d9c7a1360d736fa89140f0399ec3abfa06 这些序列号是commit id(版本号)
-
在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
-
回退到上一个版本
$ git reset --hard HEAD^
-
查看当前readme.txt的内容
$ cat readme.txt
-
回退之后,如何再回来?
只要上面的命令行窗口还没有被关掉,只要找到之前的commit id就可以回到未来某个版本
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
如果命令行窗口关掉了,也可以找到commit id,git reflog可以记录每一次命令
四、查看git状态
$ git status
1.txt 没有add,只放在了工作区
license.txt add但没有commit,放在了暂存区,但未提交存入节点
五、管理修改
Git跟踪并管理的是修改,而非文件
git add会将文件的修改放到暂存区
若在git add之后又修改了文件,再git commit,git提交的是之前版本的修改
六、撤销修改
-
readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
使用以下命令,会将工作区的修改全部撤销$ git checkout -- readme.txt
-
readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
使用以下命令,会将暂存区的修改回退到工作区$ git reset HEAD <file>
七、删除文件
-
删除工作区文件
$ rm readme.txt
-
删除暂存区文件
$ git rm readme.txt
-
将删除操作提交到版本库
$ git commit -m "del readme.txt"
-
若误删工作区文件,可从版本库中调出至工作区
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”$ git checkout -- 1.txt
八、创建分支并合并
-
创建dev分支,然后切换到dev分支
$ git checkout -b dev
$ git switch -c dev
-
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev $ git checkout dev
-
列出所有分支,当前分支前面会标一个*号
$ git branch
-
切换到已有的mster分支
$ git checkout master
$ git switch master
-
合并分支
直接把master指向dev的当前提交$ git merge dev
-
删除分支
$ git branch -d dev
九、分支冲突
- master分支和dev分支的readme.txt文件第二行有冲突
-
强行合并,会报冲突
$ git merge dev Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
-
查看状态
-
查看readme.txt文件
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
-
手动修改后,再提交
-
通过git log查看分支合并情况
用git log --graph命令可以看到分支合并图。$ git log --graph --pretty=oneline --abbrev-commit
-
删除dev分支
十、分支管理策略
-
默认使用Fast forward模式
这种模式下,删除分支后,会丢掉分支信息
-
不使用Fast forward模式
从分支历史上就可以看出分支信息
--no-ff参数,表示禁用Fast forward
本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去$ git merge --no-ff -m "merge with no-ff" dev
-
分支策略
十一、BUG分支
https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136
需要注意一下
dev合并bug分支的时候
要先复制一个特定的提交到当前分支
$ git cherry-pick 4c805e2
再将dev存储的工作现场弹出来
git stash pop
十二、Feature分支
添加一个新功能时,肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支
-
删除未合并的分支
$ git branch -D feature-01
Administrator@Y027 MINGW64 /f/gittest (dev) $ git branch -d feature-01 error: The branch 'feature-01' is not fully merged. If you are sure you want to delete it, run 'git branch -D feature-01'. Administrator@Y027 MINGW64 /f/gittest (dev) $ git branch -D feature-01 Deleted branch feature-01 (was 3030047).
十三、标签管理
-
打标签
-
最后提交的当前分支
$ git tag v1.0
-
之前提交的分支
$ git tag v0.9 0411011
-
-
创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.99 -m "version 0.1 released" 0411011
-
用命令查看所有标签
$ git tag
-
查看单独版本的具体信息
$ git show v0.99
-
删除标签
$ git tag -d v0.9
-
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
十四、本地连接gitlab远程库
远程连接使用ssh,首先查看有没有ssh
ssh cd ~/.ssh
(1) 在本地生成ssh密钥
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,将公钥的内容copy到gitlab的SSH密钥中添加即可。
$ ssh-keygen -t rsa -C "Youremail@example.com"
(2) 将远程仓库克隆下来
先在gitlab中创建一个名字叫lerngit的project
将远程仓库克隆到本地
git clone git@192.168.2.114:zhanghaoxiang/lerngit.git
(3) 将本地库内容推送到远程库上
在本地提交工程后
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
$ git push -u origin master
后面就可以直接用
$ git push origin master
(4) 解除本地与远程库的关系
$ git remote rm origin
(5) 查看远程库信息
$ git remote -v
(6) 删除远程库
gitlab setting->general->advanced->Remove project
(7) 与远程库建立连接关系
$ git remote add origin git@192.168.2.114:zhanghaoxiang/lerngit.git
(8) 远程分支管理
-
master分支是主分支,要时刻与远程同步
-
dev分支是开发分支,团队所有成员都需要在上面工作,也需要与远程同步
-
bug分支只用于在本地修复bug,没必要推到远程
-
feature分支是否推到远程,取决于是否需要合作在上面开发
-
如果远程分支冲突了,需要抓取分支
-
分别在两个文件夹(lerngit,lerngit1)中克隆同一个远程库中的文件
-
lerngit1从远程库clone时,默认情况是只有master分支的
-
lerngit2要在dev分支上开发,就必须创建远程origin的dev分支到本地
$ git switch -c dev origin/dev
-
将更改后的readme.md提交并推送到远程库
-
lerngit 同样在dev分支对readme.md文件进行了修改,并提交推送到远程库。在推送远程库时,出现报错,lerngit2最新提交的dev分支与lerngit提交的dev分支有冲突
-
将最新提交的origin/dev抓取下来,在本地合并解决冲突再提交,在抓取之前需要指定本地dev分支与远程origin/dev分支的链接。git pull相当于是git fetch + git merge
$ git branch --set-upstream-to=origin/dev dev $ git pull
-
pull成功后,合并有冲突,需要手动解决再提交并推送到远程
-
(9) 变基操作
$ git rebase dev
- rebase之前
- rebase之后
只对尚未推送或分享给别人的本地修改执行变基操作清理历史;从不对已推送至别处的提交执行变基操作
regbase参考链接:https://blog.csdn.net/michaelshare/article/details/79108233
(10) 远程标签管理
- 标签推送
- 推送单个标签
$ git push origin v1.4
- 推送全部未推送过的本地标签
$ git push origin --tag
- 推送单个标签