本地仓库
初始化 一个Git仓库,使用 git init 命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>,完成。
状态
- 要随时掌握工作区的状态,使用
git status命令。 - 如果
git status告诉你有文件被修改过,用git diff可以查看修改内容。
版本
HEAD 指向的版本就是当前版本;上一个版本就是 HEAD^;上上一个版本是 HEAD^^;当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
提交历史
git log可以查看提交历史,以便回退到哪个版本;其中c31f7042a0e...、1bb72340af...是 SHA1 计算出来的一个非常大的数字,用十六进制表示,表示 commit id 信息。
git log --pretty=oneline版本信息在一行显示
命令历史
git reflog 查看命令历史
回退版本 git reset --hard XXX
回退到上一个版本:git reset --hard HEAD^
回退到某个版本 commit id 是 1bb723 git reset --hard 1bb723
PS: 版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了
工作区和暂存区
Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git add 会将修改文件提交到暂存区(stage) 中;
git commit 会将暂存区的内容提交到当前分支 master 上。
撤销修改
- 没有提交到暂存区(stage)时撤销修改:
git checkout -- <file>git restore <file>两个命令等价;不能撤销没有提交过的untracked文件的新增
- 从暂存区(stage)撤销修改:
git reset HEAD <file>git restore --staged <file>两个命令等价;从暂存区(stage)撤销修改后,再执行步骤1即可回退到文件最开始状态。
删除文件
git rm <file> 会起到两个作用:
- 删除本地文件
- 同时同步到暂存区
- 同意删除文件,使用
git commit提交到本地仓库。 - 不同意删除文件,使用上面的 撤销修改 进行回退。
远程仓库
- 新建远程仓库
在 github 网页端 create repository:
- 建立本地分支与远程分支的关联
git remote add origin git@github.com:YY88Xu/gitskill.git
将本地代码提交到远程:
git push -u origin master
由于远程库是空的,我们第一次推送 master 分支时,加上了-u参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。
其中,
git branch -M main 可以将本地分支重命名为 main
分支管理
创建与合并分支
Git 鼓励大量使用分支:
查看本地仓库分支:git branch
创建本地仓库分支:git branch <name>
切换本地仓库分支:git checkout <name>或者git switch <name>
创建+切换本地仓库分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前本地仓库分支:git merge <name>
删除本地仓库分支:git branch -d <name>
注意上面的命令都是针对 本地仓库 的操作。
解决冲突
确切的说应该是解决本地分支合并冲突:master 分支和 feature1 分支对同一文件做了修改(且已经 git commit 仓库中),如果想把 feature1 分支合并到 master 分支的时候,有可能产生冲突:
通过 git status 命令查看状况:
包括两种解决方案:
- 继续合并:手动解决冲突,然后
git add readme.txt、git commit到仓库中; - 选择回退,不合并
feature1分支,使用:git merge --abort
在实际工作中出现冲突的情况是比较常见的,比如你和另外一个同事同时编辑了同一个文件,但是你的同事先于你先 push 到远程分支,当你准备 push 的时候会报下面的错:
当你满心欢喜
git pull 的时候,会发现有冲突:
同样的解决方案有上面两种,通常我们都是会选择手动解决冲突,然后 git add readme.txt 、git commit 到仓库中,git push 到远程仓库中。
合并策略
做合并操作的时候有 3 种模式可以选择:
更多细节:www.cnblogs.com/damoblog/p/…
笔者对 fast-forward 和 --no-ff 两种模式进行了详细对比,主分支是 main,feature-merge 和 feature-no 分别用于测试 fast-forward 和 --no-ff 两种模式:
- 将
feature-merge分支合并到main上,以及将feature-no分支合并到main上:
git merge feature-merge
git merge --no-ff -m "maerge with no ff" feature-no // 拼写多了个 a 😂
对比显示可以看出,--no-ff 会多出一次 merge 的提交信息。--no--ff 模式其实就是相当于main 指针 new 了一个跟 feature-merge 指针一样的空间并且放了相同的内容然后指向这个空间。而原来的快速模式 fast-forward,就是简单将 main 指针指向feature-merge指针指向的内容而已,并没有自己创造空间。
- 回退上一版本测试。使用
git reset --hard HEAD^命令回退到合并之前的状态:
因为 fast-forward 模式下,feature-merge 的提交记录被混在了 main 分支上,所以回退到上一版本会回退到 merge1 的版本下;而 --no--ff 模式则会真正回退到合并前的版本 187552a 版本,不会让合并和回退变得混乱。这也就是很多人都会推荐 –no-ff 的原因。
bug 分支
当手头工作没有完成时,先把工作现场 git stash 一下,然后去新建分支修复 bug,修复后,再git stash pop,回到工作现场;
在 master 分支上修复的 bug,想要合并到当前 dev 分支,可以用 git cherry-pick <commit>命令,把 bug 提交的修改“复制”到当前分支,避免重复劳动。
强行删除
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
多人协作
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
- 查看远程库信息,使用
git remote -v; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name; - 从远程抓取分支,使用
git pull,如果有冲突,要先处理冲突。
rebase
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
标签管理
创建本地标签
- 命令
git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla..."可以指定标签信息; - 命令
git tag可以查看所有标签。
操作标签
- 命令
git push origin <tagname>可以推送一个本地标签; - 命令
git push origin --tags可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。
常用指令
查询分支
- 查看本地分支
git branch - 查看远程分支
git branch -r - 查看本地和远程所有分支
git branch -a
新建分支
假设新建的分支名称为「AAA」
- 新建本地分支
git checkout -b AAA - 将新建的分支推送到远程
git push -u origin AAA - 其它终端从远程检出分支「AAA」到本地
git checkout -b origin/AAA - 建立本地分支与远程分支的链接
git branch --set-upstream-to=origin/dev dev其中,git push -u origin AAA相当于执行git push origin AAA和git branch --set-upstream-to=origin/AAA AAA。
删除分支
假设要删除的分支名称为「AAA」
- 删除本地分支
git branch -d AAA - 删除远程分支方法一
git push origin :AAA - 删除远程分支方法二
git push origin --delete AAA
修改分支名称
假设要将分支「AAA」修改为分支「BBB」
- 修改本地分支名
git branch -m AAA BBB - 删除远程「AAA」分支
git push origin :AAA - 将「BBB」推到远程
git push --set-upstream origin BBB
查看日志
- 一行显示:
git log --graph --pretty=oneline --abbrev-commit命令历史
git reflog查看命令历史
回退版本 git reset --hard XXX
回退到上一个版本:git reset --hard HEAD^
回退到某个版本 commit id 是 1bb723 git reset --hard 1bb723
强制推送到远程分支: 本地回退完后,远程如果也需要回退的话。需要推送到远程:git push -f origin master ## 这里假设只有一个 master 分支
临时隐藏代码修改
隐藏: git stash
显示:git stash pop
# git branch用法总结,查看、新建、删除、重命名
# git新建、修改、删除分支的一些常用命令
# Git教程
Git笔记:git取消Commit,取消add,回滚代码_commit add rollback-CSDN博客