一、安装的一些选项的意思
(1)Addition icons: 是否创建桌面快捷方式。
(2)Windows Explorer integration: 是否使用bash 或者 GUI工具。
(3)Associate .git*... 是否配置默认的文本编辑器。
(4)Associate .sh ...: 是否关联Bash命令行执行的脚本文件。
(5)Use a TrueType编码 : 在命令行中是否使用TruthType编码, 该编码是微软和苹果公司制定的通用编码。
(6)检查更新
选择默认的编辑器
(1)Use Git from Git Bash only:这是最谨慎的选择,因为PATH环境变量不会被修改。您只能从Git Bash中使用Git命令行工 具,不能再cmd命令行中使用Git命令
(2)Git from the command line and also from 3rd-paty software:可以在Git Bash 、cmd命令行 和 Windows PowerShell 中使 用Git命令,但是会向PATH环境变量中添加一些最小的Git包装器
(3)Use Git and optional Unix toos from the Command Prompt:会在第二个选项的基础上添加一些Unix系统中的工具,会覆 盖 Windows工具中的一些命令,例如: “find” 和 “sort”
(1)checkout Windows-style, commit Unix-style line endings:Git在检出文本文件时将LF转换为CRLF。当提交文本文件时, CRLF将被转换为LF。检查是windows格式,最后commit是unix格式
(2)Checkout as-is, commit Unix-style line endings:当检出文本文件时,Git将不执行任何转换。当提交文本文件时,CRLF将 被转换为LF。检查文本文件时不做转换,commit转为unix格式
(3)Checkout as-is, commit as-is:Git在检出或提交文本文件时不会执行任何转换操作。
二、git的大致思想
1.主要理解
head:当前commit的引用
branch:commit串
master:也是branch,但这相当于树的主干
内部如何存储:
git是用“引用(哈希值)”,一个版本(一次commit)一个commit快照,(两个版本如何联系起来的:可以理解为有个属性为前一个版本的“引用”,也就是哈希值)
本地库中有:
/config,/head, /info , /logs , /objects(存放git对象), /refs(分支存放:本地分支heads,远程remotes,) 等等
.git/下的head文件表明当前分支
git对象(会存放在objects中)
一些命令
find .get/objects -type f 查询object是下面所有的文件
git hash-object -w xxx 放到git数据库并且返回hash值
git cat-file -p xxxx 看xxx这个哈希值代表什么
Blob 对象(hash--内容)(因为内容不变,所以哈希不变,即版本未修改哈希不变)
存储的是文件内容,压缩的
文件名字是根据内容算出的一个hash值
tree对象(hash--目录)
blob对象
子tree对象
commit对象
作者提交者注释
指向一个 tree对象 的指针
文件4中状态(参考https://blog.csdn.net/qq_39135287/article/details/103352107)
Untracked:未跟踪,表示此文件在工作区中,但是并没有添加到暂存区中,通过git add fileName 命令,把文件添加到暂存区,这里的fileName是指要往暂存区添加的文件名,使文件状态由Untracked(未暂存) → Staged(已暂存)
Unmodified:未修改,即:本地仓库与工作区的内容一致,如果文件被修改,则文件状态由Unmodified(未修改) → Modified(已修改)
Modified:已修改, 仅仅只是修改, 并没有进行其他的操作,这时文件的状态可以有两种变化,一是通过使用命令git add fileName,文件状态由Modified(已修改) → Staged(已暂存),二是通过使用命令git checkout -- fiilename丢弃修改内容,即:从本地仓库取出最新内容,覆盖当前修改,文件状态由Modified(已修改) → Unmodified(未修改)
Staged:已暂存,这时文件的状态可以有两种变化,一是执行git commit命令则可以将修改的文件同步到本地仓库中,这时本地仓库与工作区的内容一致,文件状态由Staged(已暂存) → Unmodified(未修改),二是执行git reset HEAD filename命令取消暂存,文件状态由Staged(已暂存) → Untracked(未暂存)
2.常用命令
(1)版本库创建
从远程库克隆
git clone <url>
初始化本地版本库
git init
(2)修改与提交
状态查询:status
git status
查看变更内容
未提交的内容:diff
#查看不同的地方 默认查看工作区和暂存区
git diff --cached 比较cache和Repository
git diff HEAD 工作区和最新的Resository
git diff commit-id 工作区和制定的repository
git diff --cached commit-id
git diff --commit-id commit-id
#把工作空间的某个文件添加到cache
add
git add xxxx
#把工作空间的所有内容添加到cache
git add -A
改名
git rm
删文件
git mv
commit
把cache(暂存区)当中的某个文件提交到本地库
git commit -m "xxxx"
把cache(暂存区)当中all文件提交到本地库
git commit -am "xxxx"
修改最后一次提交
git commit --amend
(3)查看提交历史
git log
看历史中多个commit:log
详细改动 git log -p
大致改动 git log --stat
某个具体的commit:show
(4)撤销
git reset
git reset --mixed 是默认操作,清空暂存区,保留工作区,本地库重置位置, 即回到commit前
--soft 保留暂存区,工作区,并把head的位置所导致的新的文件差异放进暂存区,即回到add前
--hard 暂存区,工作区清空,完全还原到上个版本
git reset --hard HEAD^^ 小角个数代表重置次数。执行reset操作之后,HEAD和远程仓库不一致,需要解决冲突才能push
注:reset和checkout都可以切换head位置,但reset在移动时会带着它所指向的branch一起移动,而checkout不会
checkout(一般不用)(覆盖?)
git checkout head <file>撤销指定的未提交的文件修改内容
checkout:(1)切换分支或创建,同时head(可以理解为指针)就会指向checkout出的分支
(2)放弃掉所有还没有加入到缓存区的修改,即还未使用 git add 。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。需要自己手动删除
// 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout -- filepathname
// 放弃所有的文件修改
git checkout .
git revert <commit>撤销指定的提交(会增加一条log记录)
当我们已经有v1 v2 v3 v4时,如图,当v3需要撤销时,他会增加一个v5但内容与v2一样
(5)分支与标签
#查看当前分支 -a查看所有分支 -av 查看所有分支的信息 -avv 查看所有分支的信息和关系
git branch
#创建一个分支 基于当前分支创建分支
git branch xxx
#基于oldType创建分支
git branch newBranch oldType
删除分支
git branch -d xxx (1.删除引用,但git会在一定时间回收 2.head指向的branch不能删 3.未merge到master的branch会失败(未验证))
tag
git tag 列出所有本地标签
(6)合并与衍合
git merge <branch> 合并指定分支到当前分支
git rebase <branch> 衍合指定分支到当前分支
如:
git checkout branch1
git rebase master
(7)远程操作
git remote -v
git remote show
git remote add <remote><url> 添加远程版本库
git push 推送到远程仓库并快速合并
git fetch是将远程主机的最新内容拉到本地,不进行合并
git pull 是将远程主机的master分支最新内容拉下来后与当前本地分支直接合并 pull = fetch + merge
(8)其他
stash将本地的变化缓存起来。stash pop将代码从缓存中弹出来。可以有效利用该命令,合并远程代码。
git stash:临时存放工作目录的改动
#查看文件内容
git cat-file -p commitid
#查看对象类型 blob commit tree
git cat-file -t commitid
git log --pretty=oneline 可以显示完整的commit id
git reflog 查看历史命令
#把内容输入到一个文件
echo "xxxx" > xxxx
为电脑配置身份信息
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git log 与 git reflog的区别:
git log:显示所以提交过的版本信息,但不包括已经被删除的 commit 记录和 reset 操作记录
git reflog:显示所有的操作记录,包括已经被删除的 commit 记录和 reset 操作记录,常用于恢复本地的错误操作,即版本回退操作。
三、与svn区别
git中本地库可以相互通讯,svn不行
git中操作引用,svn操作文件
git中版本之间是快照,svn版本间是增量
如:a2相当于copy了fileA+增量△1