git简介
git,是一个分布式版本控制软件,最初目的是为更好地管理Linux内核开发而设计,分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。Git 得特点简单来说就是:高端大气上档次。
github或者gitee实际就可以充当这个服务器角色,其是一个开源协作社区。当我们通过git init创建或者git clone一个项目的时候,项目目录会隐藏一个.git子目录,其作用是用来跟踪管理版本库的。
不同状态四部分
文件状态对应的,不同状态的文件在Git中处于不同的工作区域,主要分成了四部分:
工作区:相当于本地写代码的区域,
暂存区:暂存区是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中
本地仓库:提交更新,找到暂存区域的文件,将快照永久性存储到 Git 本地仓库
远程仓库:远程的仓库,如 github。
git常用命令
初始化命令:
git clone url:下载一个项目和它的整个代码历史 git init 初始化仓库,默认为 master 分支 git add . 提交全部文件修改到暂存区 git pull <远程仓库名> <远程分支名> 拉取远程仓库的分支与本地当前分支合并 git pull <远程仓库名> <远程分支名>:<本地分支名> 拉取远程仓库的分支与本地某个分支合并
创建命令:
git checkout -b 创建+切换分支 git merge 合并某分支到当前分支
切换查看命令:
git diff 查看当前代码 add后,会 add 哪些内容 git status 查看当前分支状态 git checkout <分支名> 切换到本地某个分支 git branch 查看分支 git branch -r 查看远程所有分支 git branch -a 查看本地和远程所有分支
删除命令:
git branch -D <分支名> 删除本地某个分支 git merge <分支名> 合并分支
上传命令:
git push [remote] [branch] 上传本地指定分支到远程仓库 git push [remote] --force 强行推送当前分支到远程仓库,即使有冲突 git commit -m "<注释>" 提交代码到本地仓库,并写提交注释 git commit -v 提交时显示所有diff信息
恢复命令:
git checkout [file] 恢复暂存区的指定文件到工作区 git checkout . 恢复暂存区的所有文件到工作区
版本穿梭:
HEAD 指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭, 使用命令 git reset --hard commit_id 。 穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。 要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。
git冲突的场景,如何解决
一般情况下,出现分支冲突的场景有如下:
多个分支代码合并到一个分支时
多个分支向同一个远端分支推送
具体情况就是,多个分支修改了同一个文件(任何地方)或者多个分支修改了同一个文件的名称
如果两个分支中分别修改了不同文件中的部分,是不会产生冲突,直接合并即可
应用在命令中,就是push、pull、stash、rebase等命令下都有可能产生冲突情况,从本质上来讲,都是merge和patch(应用补丁)时产生冲突。
git冲突的修复
- 直接编辑冲突文件
使用git pull --rebase经常会出现冲突
冲突产生后,文件系统中冲突了的文件里面的内容会显示为类似下面这样:
<<<<<<< HEAD * test2 * test3 ======= * this is my modify, my be conflicked * test1000 >>>>>>> my_modify 其中:<<<<<<<(7个<)HEAD与=之间的内容是remote上的修改,冲突标记=与>>>>>>>之间的内容是我的修改内容。 在这两者之间选择任何你需要的内容保留下来,并删除所有的===,<<<,>>>即可解决冲突, 解决完成之后,git add -A, git rebase --continue就提交了代码
- 利用图形界面工具解决冲突
当然我们也可以利用图形工具解决冲突
如果要解决的冲突很多,且比较复杂,图形界面的冲突解决工具就显得很重要了。
执行git mergetool用预先配置的Meld(Beyond Compare)解决冲突。
代码提交完整流程
步骤如下:
git add -A
git commit -m “message”
git pull --rebase (或者git fetch + git rebase)
解决冲突
git add 冲突文件
git rebase –continue
git push
其中,3、4、5点,如果没遇到冲突就不用进行,直接push上去。
当遇到冲突时,git会提示patch failed,并要我们解决问题了再执行git rebase --continue