一、 简单命令
- 创建一个新的 Git 权限
git init
- 将文件从工作目录到存储区域。
git add filename
- 检查工作目录的内容,暂存区域。
git status
- unchecked 未开始跟踪状态(此时状态是红色的)
- 查看工作目录和存储区域文件的区别
白色的是上一个版本,+之后绿色的是修改的地方
按 q 退出 diff 状态
git diff
- 添加或者更改文件,Git允许把两部合成一步:
git commit filename
- 移动或者删除文件,需要分开
git rm filename
git commit
- 权限中存储区下的临时存储文件的修改
git commit -m “详情信息”
- 查看工程早期的提交版本。提交顺序存放在存储仓库中,你可以这样来查看它。
git log
- 输出是:一个40位 SHA 的码,提交的唯一标识符。
提交的作者
提交的日期时间
提交的信息
- 在 Git 中,提交你当前工作的环境的提交称为 HEAD commit。在许多情况下,最近一次的提交时 HEAD commit。
git show HEAD
二、关于回退
- 将文件存储在你的工作目录下,丢弃当前工作目录上的改变
git checkout HEAD filename
- 批量添加
git add filename_1 filename_2
- 在存储区域中重置文件为 HEAD commit 它不能够销毁工作路径中的改变,它仅仅是从存储区域中移除了它们。
将某一个版本置为HEAD commit。
git reset HEAD filename
三、分支
- 输出 * master, * 后面显示了你当前在什么分支下工作。
git branch
git branch new_branch
创建新的分支
- 切换分支
git checkout branch_name
- 合并分支
git merge branch_name
冲突的情况:
<<<<<<< HEAD
master version of line
=======
fencing version of line
>>>>>>> fencing
输入 fencing 选择 fencing 分支中的 HEAD 作为 HEADcommit
- 删除分支
git branch -d branch_name
三、remote 远程仓库
- 克隆远程仓库到工作目录下的名称
git clone remote_location clone_name
- 查看 git 的远程仓库
git remove -v
- 将远程仓库的改变合并到本地的仓库中。它将会将这些改变添加到远程分支里面。
git fetch
- 将远程仓库中的改变合并到你的本地 master 分支。
git merge origin/master
- 将 test 分支上的指定文件合并到当前分支
git checkout test xxx.txt
- 创建本地分支,并指定拉取跟踪的远程分支
git checkout --track origin/remoteName -b localName
- 将其他分支的提交合并到当前分支 cherry-pick
git checkout 想要合并的分支
//单个提交
git cherry-pick 某分支的某个提交的commit-hash
//多个提交,中间使用空格分割
git cherry-pick commit-hash1 commit-hash2 commit-hash3
//合并 commit1 到 commit2 的多个提交
git cherry-pick commit1..commit2
- git revert
当别人已经克隆线上提交的代码之后,尽量使用 git revert 来减少影响
//撤销master当前往上属第三个提交
git revert master~3
//撤销前的分支
A->B->C->D->E->F->G
//撤销后
A->B->C->D->E->F->G->D‘
- 修改之前的提交
git commit --amend
- 变基提交
-
用来改变一串提交是以什么为基础的,举例说明,master 在基于 D 提交之后出现了topic 分支,topic 分支在之后发展了 w、X、Y、Z 提交,master 在D 之后有了 E、F、G、H、I 提交,如果让topic 以最新的 master 的 I 提交作为基,如图:
-
//变基命令
git checkout topic
git rebase master
//或者
git rebase master topic
- 将一条分支上的开发线整个移植到完全不同的分支上:
//将基于 maint 当前提交的上一个提交分出的分支feature 移植到master 分支上。
git rebase --onto master maint^ feature
-
变基操作出现冲突解决方案:
- 如果发现冲突 rebase 会临时挂起,当冲突解决可以使用 git rebase -continue 恢复变基操作,当觉得这个提交是没有必要的,可以使用 git rebase --skip 跳过(风险很大,有可能之后的提交会依赖这个提交)。如果认为不应该进行变基操作,使用 git rebase --abort 终止
改写提交历史,合并之前提交
//修改基于commit 之后的提交
git rebase -i commit
多人协作时候的提交merge 现象:
两个人都基于 develop 分支 B commint 进行开发,a 提交到了远程仓库 C 提交,
b 也提交了D 本地提交,当b 想要推送至远程仓库的时候,就发生了,问题,出现了 merge 痕迹。git pull --rebase
拉取上游提交并且把本地提交变基到它们的头部后。设置一些git配置
git config --global user.name "name"
git config --global user.email "eamil@xx.com"
//查看配置
git config -l
//cat 查看
cat .git/config
//移除设置
git config --unset --global user.email
- 设置别名
git config --global alias.show-graph \
'log --gragh --abbrev-commit --pretty=oneline'
- 查看已暂存的文件的sha1
git ls-files --stage
- 将文件从暂存中取消
git rm --cached filename
- 重命名文件
//1
mv stuff newstuff
git rm stuff
git add newstuff
//2
git mv stuff newsuff
//显示被改名的文件的整个历史记录
git log --follow filename
四、Git 对象模型
-
Git 对象模型分为工作目录,索引和对象库。
第一步,工作目录变化。当刚编辑完文件,有变化的只有工作目录中的文件内容。
第二步,对象库中出现新的blob,索引指向新的blob。当 add file1 之后对象库中出现了新的 file1 文件的散列ID,然后索引也重新指向新的散列 ID。
-
第三步,创建新的提交,HEAD变化。commit 之后会有三个步骤:
- 虚拟树对象,索引将转换成一个真实的树对象之后,以SHA1 命名,然后放到对象库中。
- 其次,用日志消息创建一个新的提交对象后,新的提交将会指向新创建的树对象以及前一个或父提交。
- master 分支的引用从最近一次提交移动到新创建的提交对象,成为新的master HEAD。
五、Git 的工作流程
1.从远程仓库抓取并且合并改变
2.为一个新的工程创建一个工作的分支
3.在分支上开发并且提交工作
4.从远程仓库抓取并且合并
5.将分支传递到远程仓库
git push origin your_branch_name
- 会将内容上传到远程仓库,origin 原始仓库。别人可以重新生成分支并且将你的工作合并到 master 分支上。
六、提交
- HEAD
始终指向当前分支的最近提交,当切换分支的时候HEAD会更新为指向新分支的最近提交 - ORIG_HEAD
当进行某些操作,merge或reset 时,会将调整为心智之前的先前版本的HEAD记录到ORIG_HEAD,便于回滚。 - FETCH_HEAD
当使用远程库时候,git fetch命令将抓取分支的头记录到 git/FETCH_HEAD中。FETCH_HEAD是最近抓取fetch分支的HEAD 简写。 - MERGE_HEAD
当一个合并操作正在进行时候,MERGE_HEAD是正在合并进 HEAD 的提交 - 在master 分支但是不在dev topic 分支上的提交
git log ^dev ^topic master
- 使用git blame 查看每一行责任归属
#从第一行开始查询
git blame -L 1, filename ```
---
###七、diff
+ 工作目录与索引
git diff
+ 工作目录与 HEAD
git diff HEAD
+ 索引与 HEAD
git diff --cached
###八、更改提交
+ git reset-soft 提交
--soft 会将 HEAD 引用指向给定提交,索引和工作目录保持不变。这个命令有最小影响。
+ git reset-mixed
--mixed 会将HEAD 指向给定提交,索引内容也跟着改变以符合给定提交的树结构,但是工作目录保持不变。
+ git reset-hard 提交
HEAD 指向给定提交。索引内容也跟着改变以前符合给定提交的树结构。此外,工作目录页改变以反映给定提交的树的状态。当改变工作目录的时候,整个目录结构都改成给定提交对应的样子,做的修改都将丢失。