目录
- 1. git 实战
- 2. Git
- 3. Git基础
- 4. Git进阶
1. git 实战
1.1. 多人协作
1.1.1. 多人协作中的 push
& 冲突解决
- 多人协作中版本推送到远程仓库的流程
- 整理好本地仓库的版本:使用git add 和git commit生成一个新的版本;
- 尝试直接将本地的更新推送到远程仓库。使用 git push。
- 若 push 失败,则说明远程仓库的分支版本领先本地,即从上次pull或者fetch后,有人提交过更新。解决方案如下。
- 获取远程的最新版本与本地分支合并,使用git pull 或者git fetch + git merge。
- 合并时,若出现冲突,手动解决冲突后,使用git add 和git commit生成一个新的版本。
- 使用git push 将合并后的版本推送到远程仓库。
参考:git多人push
1.2. 回退
- 还原/恢复单个文件
# 未git add git checkout -- aaa.html // 指定还原`aaa.html`文件 git checkout -- * // 还原所有文件 # 已经add 未commit git reset HEAD // 回退到当前版本 git checkout -- aaa.html # 已经commit git reset HEAD^ // 回退到上一个版本, HEAD~数字 是回退到数字个版本 git checkout -- aaa.html
参考:
1.3. 冲突解决
git chrry pick 和 git rebase 之后, 存在冲突:
-
解决方法
1. 手动解决所有冲突 2. git add 添加修改的文件 3. git rebase --continue 4. git commit --amend 或 git commit -m "" 5. git push
-
冲突类型
- 对于“both added”、“both deleted”、“both modified”等类型的冲突,若想完整地保留某一方的修改可以执行git checkout --ours(或者–theirs) <文件名>来选择想要保留的版本。
- 需要注意的是由于git rebase 是先撤销再应用commit,所以这里的ours指的是upstream-branch,theirs指的是我们将要应用的临时commit。
-
git rebase 如何撤销:
git rebase 过程中可以使用git --abort/--continue来进行操作; -- 成功之后如何撤销呢? git reflog查看本地记录 git reset --hard 'rebase之前的第一个ID'
参考:
1.4. 版本差异比较
1.4.1. 远程与本地 差异比较
1.4.2. 文件差异比较
2. Git
2.1. 概述
分布式 版本管理工具;
2.1.1. git、bash、shell区别
-
git
版本控制工具,支持该工具的网站有Github、BitBucket、Gitorious、国内的osChina仓库、csdn仓库等等。 -
shell
是linux、unix系统的外壳,也可以理解为命令行,就是你输入并执行命令的地方,git通过命令行和图形界面两种方式使用shell。 -
bash
是shell的一种,最常用的shell之一。 -
git Bash
方便你在windows下使用git命令的模拟终端(windows自带的cmd功能太弱)linux、unix可以直接使用git。 -
git shell
它是安装了git的shell,bash是一种shell。
2.1.2. 界面化管理工具:
-
GitHub for Desktop
-
Source Tree
-
TortoiseGit
SVN 有关;
参考:
2.2. 参考资料
- git Reference
- Windows下Git的使用 //命令实施解析 牛皮
- Git实用 视频教程 小甲鱼 //极客首选之Python
- Git 教程 //菜鸟教程
- 常用 Git 命令清单 //更全面,熟练使用必备;
- git 项目管理常用操作流程 //git 操作流程
2.3. git辅助工具
- TortoiseGit 小乌龟
参考:
3. Git基础
3.1. 基础知识
- 模式种类
a) 界面模式 仅包含常用命令
b) 命令行模式 包含所有命令 要掌握 - Git介绍
a) Git每个版本独立保存;
- 词汇
fetch 拿来; checkout 结账; rebase 重订基准; --pull
3.1.1. Git常用命令
常用命令:
3.1.2. Git结构
### 3课树的结构;
Workspace 工作区(电脑里看到的目录)
Index / Stage 暂存区(.git目录,.git/index)
Repository 仓库区(或本地仓库 git版本库)
Remote 远程仓库
主要结构及操作:
3.2. 配置 --global
.gitconfig 分为项目配置和全局配置;
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
# 查看 所有用户配置
git config --list
## 编辑信息
vim ~/.gitconfig
3.3. 新增 & 添加
当前目录下的版本控制;
# 在 当前目录新建一个Git代码库
git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史 ## 下载项目;
git clone [url]
## 注:从GitHub下载项目,的确很慢;
3.3.1. clone 详解:
#从现有Git仓库中拷贝项目
git clone <repo>
# 克隆项目的指定分支 git clone 指定分支
git clone -b <分支名> <repo>
#克隆到 指定的目录
git clone <repo> <directory>
### 不同协议
git clone git@github.com:fsliurujie/test.git --SSH协议 #速度较快;
git clone git://github.com/fsliurujie/test.git --GIT协议
git clone https://github.com/fsliurujie/test.git --HTTPS协议
## 等价的git clone写法:
git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new
3.3.2. 增加/删除文件
git add //添加到暂存区域
git add * //添加 目录下的全部文件
3.3.2.1. 增加及删除
- 增加、删除 文件|目录
# 添加指定文件到暂存区 git add [file1] [file2] ... # 添加指定目录到暂存区,包括子目录 git add [dir] # 添加当前目录的 所有文件到暂存区 git add . # 添加每个变化前,都会要求确认 # 对于同一个文件的多处变化,可以实现分次提交 git add -p # 删除工作区文件,并且将这次删除放入暂存区 git rm [file1] [file2] ... # 停止追踪指定文件,但该文件会保留在工作区 git rm --cached [file] # 改名文件,并且将这个改名放入暂存区 git mv [file-original] [file-renamed]
3.3.2.2. 删除详解
删除也是一种修改,删除的方式有2种:
1. rm 相当于在资源管理器里面直接删除,只删除工作区的文件,可以直接使用checkout还原;
2. git rm 则是删除工作区和暂存区的文件,需要先使用reset,再使用checkout还原(只用这个会报错);
3. 彻底删除文件,则git rm git后需要git commit。
3.3.2.3. git clear
删除一些没有 Git add 的 文件;
- 参数
git clean 参数 -n 显示 将要 删除的 文件 和 目录 -f 删除 文件,-df 删除 文件 和 目录 ## 实际使用 git clean -n git clean -df 目录等 强制删除; git clean -f "指定文件" --删除指定文件;
3.4. 代码提交
3.4.1. git commit
# 提交暂存区到 仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
# 提交时显示所有diff信息
git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...
3.4.2. 信息修改
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 更改 前n次的commit -m " 信息 "
git rebase -i HEAD~n
3.5. 回滚
3.5.1. 查看状态/信息
git status
git log //查看记录 commit记录
git reset //返回之前
git push -f //强行回退远程代码 回滚本地后, 强推;
-
查看 ID 信息
# 获取完整commit id #(如:14123c8877e6ebdc220e205d92fc70feaf06dab1) git rev-parse HEAD # 获取short commit id(如:14123c8) -- 前7位; git rev-parse --short HEAD
-
git log、git show 等
# 显示有变更的文件 git status # 简短结果 显示有变更的文件; git status -s # 显示当前分支的版本历史 git log # 显示commit历史,以及每次commit发生变更的文件 git log --stat # 搜索提交历史,根据关键词 git log -S [keyword] # 显示某个commit之后的所有变动,每个commit占据一行 git log [tag] HEAD --pretty=format:%s # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件 git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件改名 git log --follow [file] git whatchanged [file] # 查看某个文件的提交历史 git log filename ## filename 需要是当前目录下的文件 或 指定文件路径 # 显示指定文件相关的每一次diff git log -p [file] # 显示过去5次提交 git log -5 --pretty --oneline # 显示所有提交过的用户,按提交次数排序 git shortlog -sn # 显示指定文件是什么人在什么时间修改过 git blame [file] # 显示暂存区和工作区的差异 git diff # 显示暂存区和上一个commit的差异 git diff --cached [file] # 显示工作区与当前分支最新commit之间的差异 git diff HEAD # 显示两次提交之间的差异 git diff [first-branch]...[second-branch] # 显示今天你写了多少行代码 git diff --shortstat "@{0 day ago}" #===== git show ========= # 显示某次提交的元数据和内容变化 git show [commitID] # 查看提交所更改的文件 git show commitId --stat # 显示某次提交发生变化的文件 git show --name-only [commit] # 显示某次提交时,某个文件的内容 git show [commit]:[filename] # 查看某次commit中具体某个文件的修改 --查看文件的更改 git show commitId fileName # 显示当前分支的最近几次提交 git reflog
3.5.2. 回滚/撤销
-
返回
git reset --mixed HEAD~ 返回上一个 git reset --soft head~ 软返回 git reset --hard head~
-
HEAD 详解
HEAD 表示当前版本 HEAD^ 上一次版本 HEAD^ 上上版本 HEAD~2 上上版本 #使用数字; ~ + 数字;
-
回滚 / 撤销
# 恢复 暂存区的指定文件到工作区 ## 注意:会清除工作区中从未添加到暂存区的改动; git checkout [file] # 恢复某个commit的指定文件到暂存区和工作区 git checkout [commit] [file] git checkout HEAD^ --file # file文件回退到HEAD^版本 ##会 清除工作区和暂存区 未提交到master的更改; 需谨慎; git checkout HEAD . 或 git checkout HEAD <file> # 恢复暂存区的所有文件到工作区 git checkout .gi # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 git reset [file] # 重置暂存区与工作区,与上一次commit保持一致 git reset --hard # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 git reset --hard [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变 git reset --keep [commit] # 新建一个commit,用来撤销指定commit # 后者的所有变化都将被前者抵消,并且应用到当前分支 git revert [commit] # 暂时将未提交的变化移除,稍后再移入 git stash git stash pop git stash list git stash apply listnum git stash save "保存的描述信息" git stash show -p stash{num} 查看stash{num}的更改内容
3.5.3. 回滚的类型
1. 个别文件
git reset 版本快照 文件名/文件路径
2. 快照
git reset 版本快照的版本号
3.5.4. 提交 与 修改
- 提交之后,又需要修改
3.6. 版本对比
git diff 比较文件的不同,字符的比较;
3.6.1. 比较的类型
- 快照的比较
git diff 快照ID - 比较暂存区、库中的内容:
git diff –cached
3.7. 远程仓库
3.7.1. 远程同步 – git pull
& git push
git remote
与服务器、GitHub等远程连接;
-
常用命令
# 新建分支并切换到指定分支 git checkout -b 本地分支名 origin/远程分支名 # 下载远程仓库的所有变动 git fetch [remote] # 显示所有远程仓库 git remote -r # 查看本地分支及追踪的分支 git branch -vv # 显示某个远程仓库的信息 git remote show [remote] # 增加一个新的远程仓库,并命名 git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并 git pull [remote] [branch] == git push == # 将本地分支推送到远程 git push <远程主机名> <本地分支名>:<远程分支名> git push -u origin dev:release/caigou_v1.0 # 上传本地指定分支到远程仓库 git push [remote] [branch] # 强行推送当前分支到远程仓库,即使有冲突 git push [remote] --force # 推送所有分支到远程仓库 git push [remote] --all
-
强行覆盖本地更改
# git强制覆盖本地命令(单条执行): git fetch --all git reset --hard origin/master git pull ? 第一个是:拉取所有更新,不同步; 第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件); 第三个是:再更新一次(其实也可以不用,第二步命令做过了其实);
3.7.1.1. 其他
-
服务器、GitHub连接
在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥, 然后将其加入 git 账户的 ~/.ssh/authorized_keys 文件。 这样一来,所有人都将通过 git 账户访问主机。# 连接服务器 git clone git@'服务器地址':/home/git/test/tmp.git; # 连接 GitHub
3.7.2. git pull 与 git pull --rebase
- 区别
# 区别 git pull = git fetch + git merge git pull --rebase = git fetch + git rebase # 具体分析: ## git rebase 能够减少菱形冲突; 1. 在rebase的过程中,有时也会有conflict,这时Git会停止rebase并让用户去解决冲突; 解决完冲突后,用git add命令去更新这些内容,然后不用执行git-commit,直接执行git rebase --continue, 这样git会继续apply余下的补丁。 2. 在任何时候,都可以用git rebase --abort参数来终止rebase的行动,并且mywork分支会回到rebase开始前的状态。
git rebase 将E提交废除;
3.8. 文件删除、重命名
3.8.1. 删除文件
git rm 文件名
git rm -f 文件名 //强力删除文件
git
3.8.2. 修改文件名
git mv 文件名 新文件名
git mv/ren 文件名 新文件名 //ren windows的命令
4. Git进阶
4.1. 分支管理 //重要
备注:
- master 主分支
- HEAD 指向 有提示;
4.1.1. 分支命令
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 新建一个分支,指向指定commit
git branch [branch] [commit]
# 新建一个分支,与 指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
git merge [branch]
# 选择一个commit,合并进当前分支
git cherry-pick [commit]
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
4.1.2. 切换分支
1) git checkout 分支名; HEAD指向一个分支,使用命令进行切换;
2) git log --decorate --oneline --graph –all 精简显示文件的log
4.1.3. 合并、删除分支
## 分支管理
git merge *** 合并分支名
git branch -d *** 删除分支
git branch -d 会在删除前检查merge状态(其与上游分支或者与head)。
git branch -D 是git branch --delete --force的简写,它会直接删除。
checkout reset 区别
reset 将指定文件只覆盖到暂存区域;
4.2. 标签管理
-
标签的作用
-
常用命令:
# 列出所有tag git tag # 新建一个tag在当前commit git tag [tag] # 新建一个tag在指定commit git tag [tag] [commit] # 删除本地tag git tag -d [tag] # 删除远程tag git push origin :refs/tags/[tagName] # 查看tag信息 git show [tag] # 提交指定tag git push [remote] [tag] # 提交所有tag git push [remote] --tags # 新建一个分支,指向某个tag git checkout -b [branch] [tag]
4.3. 使用GitHub
4.4. 使用码云
使用码云克隆github上的项目,速度较快;
4.5. 自定义Git
4.6. 其他
# 生成一个可供发布的压缩包
git archive