- 主要有三块区域:工作区/暂存区/远程仓库
- 工作区可以理解是平时代码编辑的地方
- 暂存区可以理解是git add之后的地方
- 远程仓库可以简单理解为git push 后的地方
- git commit后会在本地新增一个节点
00 HEAD
- Git中有一个名为 HEAD 的特殊指针,它是一个指针,指向当前所在的本地分支(可以将 HEAD想象为当前分支的别名)
01 查看状态
- git status
02 把工作区文件放到暂存区文件
- git add . # 点表示匹配当前目录下的所有改动的文件
- git add <file_name1> <file_name2> # 定向添加某个文件,或多个文件,以空格分隔
- git add <path>/* # 通配符,表示匹配path路径下的所有文件
03 把暂存区文件提交到远程仓库中:注:注释可以通过单引号来换行’’
- git commit -m <info_message>
04 查看提交记录(commit记录)
- git log # 默认查看所有
- git log --author="vegazhang" # 查看指定用户的git提交记录
05 配置用户名和邮箱
- git config --global user.name "vegaviazhang" # 最好和github一致
- git config --global user.email "vegazhang@fox.com" # 最好和github一致
- git config --global --list # 可以查看到配置的信息
06 删除文件
- 1) 资源管理器直接右键删除;然后再git add <file_name>
- 2) 或者命令行直接使用如下命令: git rm <file_name>
07 重命名文件
- 1) 资源管理器右键修改文件名
- 2) 或者命令行直接使用如下命令: git mv <old_file_name> <new_file_name>
08 移动文件到其他未知
- 1) 资源管理器拖拽
- 2) 或者命令行直接使用如下命令: git mv <file_name> <folder_name(文件夹名)>
07/08放一起 (移动并重命名):
- 命令行:git mv <old_file_name> <folder_name>/<new_file_name>
09 查看具体某次提交时,某个文件前后的变化
- 方法1):
(1) 要先拿到具体某次提交的id
git log --pretty=oneline <file_name> # 某个具体文件的提交日志,并在一行上显示,拿到行首的字符串,也就是提交的id
(2) 使用命令显示某次某个文件提交前后的具体变化
git show <commit_id>
- 方法2):查看该文件的改动,上级及之前的版本改动
(1) git log -p <file_name>
-【fyi】:**【
- 改动后文件,
- 如果文件没有被添加到暂存区,一般为红色
- 如果文件已经添加到暂存区,一般位绿色
- 】**
10 恢复某个文件的改动(即与上一次提交的状态保持一致)(******)
- 注:此时这个文件并没有被添加到暂存区,即没有使用git add <file_name>,才可以使用,add之后文件的处理看下面11
- git checkout -- <file_path/file_name>
11 撤销某个文件的追踪【重点关注】
- 注:应用场景:已经被git add 的文件撤销其追踪,然后可以使用10中git checkout -- <file_path/file_name>
- git reset HEAD <file_path/file_name>
- 此时的颜色恢复到红色
- 再使用10中的git checkout -- <file_path/file_name>
12 将所有文件的代码(即整个项目)回到上一个版本或者指定版本【重点关注】【慎重使用】
- <font size="4" color="blue">此方法会使本地工作区的代码一并改变,慎重</font>
- 方法1):回退到附近的版本
(1) git reset --hard HEAD^ # 一个尖括号:表示回到上一个版本
(2) git reset --hard HEAD^^ # 2个尖括号:表示回到上两个版本
- 方法2):利用<commit_id>,回退到指定的版本(可以回到上1,2,3,50,100,1000个版本。。。)
step1:git log # 获取想要回到的<commit_id>
step2:git reset --hard <commit_id>
13 将指定文件回退到指定版本【重点关注】
- git checkout <commit_id> -- <file_name>
14 将修改的内容推送到远程仓库【重点关注】
- 推送到远程仓库命令形式:git push <远程主机名> <本地分支名> <远程分支名>
- 例如:git push origin master:refs/for/master
- 上述命令即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。
- 下面具体来看以下几种形式:
- 1) git push origin <branch_name> # 如果远程分支被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
- 2) git push origin :refs/for/master #如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
- 3) git push origin # 如果当前所在分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
- 4) git push # 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
- 5) git push -u origin <branch_name> # 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
15 给每个版本创建一个独特标签,并做版本标签管理
- git tag # 不添加任何参数,显示所有的标签
- git tag <tag_name> # 默认添加标签到最新一次的commit上面,可以通过git log 查看添加上的标签
- git tag <tag_name> <commit_id> # 针对某次提交添加标签
- git tag -d <tage_name> # 删除标签,需要给出标签名这个参数
- git push origin <tag_name> # 将标签推送到远程仓库
分支模块:多人开发
16 创建、删除、切换分支的操作:以下branch_name表示分支名称【重点关注】
- 注:这里的删除分支指的是删除本地的分支,删除远程分支看21
- 创建分支:git branch <branch_name>
- 显示本地分支:git branch # 注:带星号的是当前所在分支
- 切换到指定分支:git checkout <branch_name>
- 删除本地指定分支:git branch -d <branch_name> # 注:(1)不能删除当前所在分支;(2)分支有提交代码(有commit操作),则也不能删除
- 创建并切换到该分支:git checkout -b <branch_name>
17 将开发分支(eg:dev_vega)的代码合并到主线(eg:master)中去,并且开发分支的代码要不受影响【重点关注】
- step0:目前在开发分支(dev_vega)上,并且写好所有代码
- step1:开发分支(dev_vega)需要commit:git commit -m "message"
- step2:切换到合并到的分支(master)上去:git checkout master
- 注:当前所在分支为主线分支(master)
- step3:把开发分支上的代码合入:git merge dev_vega
18 合并分支时有冲突的处理【重点关注】
- fyi(for your infomation,场景描述):还是要将开发分支(eg:dev_vega)的代码合并到主线(eg:master)中去,但是两个分支中同时修改了一个地方,
- master主线中改了某个文件某一个位置的代码并且commit了,开发分支dev_vega也改了这个地方的代码也commit了,这时若将dev_vega开发分支的代码合并到
- 主线master中,(也就是按照17进行操作),就会出现冲突:提示如下错误
- 【CONFLICT (content):Merge conflict in <file_name>. Automatic merge failed; fix conflicts and then commit the result.】
- 此时到该文件<file_name>中会发现如下问题:
```
<<<<<<<<<<< HEAD # (这里改的也就是当前分支(master)的对该处的修改)
<update by master>
===========
<update by dev_vega>
>>>>>>>>>>> dev_vega # # (这里改的也就是要dev_vega(git merge <branch_name>:即merge之后的分支名)的对该处的修改)
```
- 合并分支时提示有冲突,此时有两种方法:
- 方法1):
- step1:17当中的操作
- step2:(忽略其它分支,保留当前所在分支)直接保存当前所在分支的代码,丢弃到[git merge]后分支的代码: git merge --abort
- 方法2):
- step1:17当中的操作
- step2:将界面切换到冲突的文件中,将这两份代码进行修改,选择合适的进行保留
- step3:通过git status查看一下当前状态,会出现以下两行提示:git status
- your have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)
- unmerged paths:(use "git add <file>..." to mark resolution) both modified:<file_name>
- step4:将修改冲突后的代码添加到当前所在分支(master)的缓存区:git add <file_name>
- step5:直接使用代码,不需要添加参数:git commit
- 此时,系统弹出一个可以编辑页面,用法同linux中的vim,可以简单输入上述step2中处理过程的方法
- step6:此时再查看状态,不会再有both modified的提示:git status
- step7:再提交代码:git commit -m "解决冲突后的代码"
- step8:再使用git push可以推送到远程仓库
分支模块:git多人分支集成协作时的常见场景
19 不同人想要查看版本路线如何进行操作
- git log --oneline --graph
20 远程/本地:一些基本的命令
- git branch # 查看本地分支
- git branch -r # 查看远程分支
- git branch -a # 查看所有(远程+本地)分支
- git branch -v # 查看各个分支最后一个提交信息
- git branch --merged # 查看哪些分支已经合并入当前分支
21 日常下拉代码更新操作
- 需要使用到git fetch 和git merge
- git merge 命令是用于从指定的commits(即merge参数后指定的)合并到当前所在分支的操作
- 例如:要将master分支上的v22,v32,v42这些commits的代码合并到dev分支上
- step1:先要拉取远端master分支的代码:git fetch origin master
- step2:当前要把master中v42的代码合并到当前所在分支上,示意图如下:
- v21-v31-41 (dev) <-当前所在分支
- /
- v1-v2-v22-v32-v42 (master)
- step3:这时使用:git merge master
- 拉取远端仓库代码:git fetch origin <branch_name>
- 例如:拉取远端上develop分支的代码:git fetch origin develop
- 拉取远端master分支的代码:git fetch origin master
- 该命令执行完后需要执行 git merge 远程分支到你所在的分支
- 【从远端仓库提取数据并尝试合并到当前分支:git merge】
22 首次建分支时推荐使用:【重点关注】
- git checkout -b <branch_name_vega> origin/<remote_branch_name_master>
- 以上命令有以下3个作用:
- 1)在本地新建一个分支 branch_name_vega
- 2)将远程分支 remote_branch_name_master的代码拉到本地
- 3)同时切换到新建的分支 branch_name_vega
23 删除不想要的远程分支
- 注:删除前要确认待删除的远程分支不再需要(代码已经合并、废弃等确实不用了)
- git push origin -d <branch_name> # 注:该操作不会删除本地的同名分支,如有需要:git branch -d <branch_name>
24 不同人修改了不同文件导致push失败【重点关注】
- fyi:当其他人修改代码,并已经提交并推送到远程仓库中;如果此时自己也修改了代码,并且也想要提交到同一仓库中,即如下操作
- step0:git fetch # 拉取远程仓库到本地
- step1:git add <file_name> # 添加修改的文件到暂存区
- step2:git commit -m <message> # 提交
- step3:git push # 推送到远程仓库,此时会有如下错误出现,并终止push(即无法push)
- ![rejected] <branch_name>-><branch_name> (non-fast-forward)
- error:failed to push some refs to "https://github.com/xxxxxx/xx.git/"
- hint:Updates were rejected because the tip of your current branch is behind
- hint:its remote counterpart.Interate the remote changes(e.g.
- hint:'git pull ...') before pushing again.
- hint:See the "Note about fast-forwards' in 'git push --help' for details
- step4:这时需要先进行merge一下远程仓库拉下来的代码(意思就是把代码合并到当前分支,后面代码中的branch_name参数是被拉下来合要被当前分支的分支):git merge origin/<branch_name>
- 此时可以输入一些改动信息
- step5:最后再输入:git push
25 模拟正常情况下不同人修改相同的文件过程【正常使用】
- fyi:现远端有一个分支develop,A需要将这个分支拉到本地,修改后提交并推送到远端
- step0:git branch -av # 查看远端与本地所有分支,并显示最后一次提交信息,选择目标的分支,这里以remotes/origin/develop为例# 【仅第一次建分支时使用,后续提交操作不需使用】
- step1:git checkout -b dev_A remotes/origin/develop # 创建并切换到dev_A分支,并与远端develop产生关联,后续推送git push 表示推送到该远端分支 # 【仅第一次建分支时使用,后续需要使用git merge】
- step2:修改文件
- step3:git add <file_name>
- step4:git commit -m A做的修改
- step5:git push # 推送到远端develop
- fyi:B也需要对该分支的文件进行修改
- step6:拉取远端所有分支及改动:git fetch
- step7:git branch -av # 【仅第一次建分支时使用,后续提交操作不需使用】
- step8:git checkout -b dev_B remotes/origin/develop # 【仅第一次建分支时使用,后续需要使用git merge】
- step9:修改文件
- step10:git add <file_name>
- step11:git commit -m B的修改
- step12:git push
26 多人开发下推荐使用【git fetch】 + 【git merge】,而不是【git pull】【重点关注】
- git pull的原理:https://www.cnblogs.com/ruiyang-/p/10764711.html
- 【git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方】
- 【将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新】
- 宁愿做的慢一些,也不愿意返工重来
27 新建仓库并初始化
- 不会经常使用,将新建仓库并初始化的其中一种做法介绍如下:
- step1:安装git【若使用windows需要安装git for windows】,注:这里可以使用vscode等IDE工具
- step2:先在github或者gitlab页面新建一个仓库,此时会有【The repository for this project is empty】的提示
- step3:在本地新建一个文件夹,名称建议与仓库名保持一致
- step4:进入新建的文件夹,右键菜单【Git Bash Here】
- step5:初始化一个仓库:git init
- step6:可以添加一些文件:git add . # . 表示当前文件夹下的所有文件
- step7:提交:git commit -m 初始化仓库
- step8:回到浏览器中仓库的页面,复制下面类似下面一行代码(意思就是产生关联):git remote add origin git@192.168.2.246:vega/demand_vega.git
- step9:推送代码,并指定一个默认主机产生关联,此后可以直接使用【git push】:git push -u origin master
28 合并分支
参考:https://blog.youkuaiyun.com/qq_42780289/article/details/97945300
情景1:没有修改相同的文件
- 场景介绍:当前在dev_vega分支,需要将dev_vega分支上的代码合并到开发分支develop分支上
- step1:在dev_vega分支改完代码commit后[git add <changed files>;git commit -m <message>]
- step2:git checkout develop : 切换分支到develop
- step3:git pull origin develop : 将远程origin分支的最新代码拉下来,
- step4:git merge dev_vega :将dev_vega分支合并到当前分支develop中
- step5:git push origin HEAD : 将当前develop分支合并到远程的同名develop分支中
情景2:修改相同的文件
- 场景介绍:当前在dev_vega分支,需要将dev_vega分支上的代码合并到开发分支develop分支上,同时,develop分支已经发生了另一次提交,并且与dev_vega分支改了相同的文件,vega在不知道的情况下也采用上面的step1-step4方法进行合并
- step1:在dev_vega分支改完代码commit后[git add <changed files>;git commit -m <message>]
- step2:git checkout develop : 切换分支到develop # 20210728 git checkout -b develop origin/develop
- step3:git pull origin develop : 将远程origin分支的最新代码拉下来,
- step4:git merge dev_vega :将dev_vega分支合并到当前分支develop中
- 注:此时会发现,合并是失败的,Git 做了合并,但是没有自动地创建一个新的合并提交。
- Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用
- git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
$ git status
On branch develop
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: test-1.txt
no changes added to commit (use "git add" and/or "git commit -a")
- step5: 任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。
- Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。
- 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子
This is test-1.
update test-1.
add test-1.
<<<<<<< HEAD
test develop.
=======
test dev_vega.
>>>>>>> dev_vega
- step6:里 HEAD 表示所指示的版本(也就是你的 develop 分支所在的位置,
- 因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),
- 而 dev_vega 分支所指示的版本在 ======= 的下半部分。 为了解决冲突,
- 你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。
- 例如,你可以通过把这段内容换成下面的样子来解决冲突:
This is test-1.
update test-1.
add test-1.
test develop.
test dev_vega.
- step7: 然后手动提交
$ git add fix_conflict_file # 这里加上冲突的文件
$ git commit -m "fix_conflict"
[develop f7daa6b] fix_conflict
这篇博客详细介绍了Git的基本操作,包括查看状态、提交、分支管理、合并、解决冲突等,重点讲解了如何将代码推送到远程仓库、回退版本、处理分支合并冲突,以及多人协作的最佳实践。
1310

被折叠的 条评论
为什么被折叠?



