和svn的区别 svn是集中式版本控制系统,代码保存在一台中间服务器上,只有联网才能工作 git是分布式版本控制系统,每个人本地都存在一个版本库,中间服务器只是为了方便合并代码 因为所有数据都在本地,所以git安全性高,速度快 git直接记录快照,而非差异比较,每一次的提取操作,实际上都是一次对代码仓库的完整备份 快照 Git 并不保存前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。 每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。 为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。 三个区域 working directory(本地工作区) 除.git外的文件 staging area(暂存区) 需要提交的文件必须先add到此区,信息存在.git中的index文件 git directory(版本仓库) .git文件夹,版本仓库分为本地的版本仓库,远程的版本仓库(可以没有) 文件的生命周期 untracked(未跟踪) unmodified(未修改) modified(已修改) staged(已添加到暂存区) 状态转换 未跟踪-->已添加到暂存区 git add 已修改-->已添加到暂存区 git add 已添加到暂存区-->未修改 git commit 或撤销回复 未修改-->未跟踪 git rm --cached 基本工作流程 1. 在工作目录中修改某些文件。 2. 对修改后的文件进行快照,然后保存到暂存区域。 3. 提交更新,将保存在 暂存区域 的文件快照永久转储到 Git 目录 中。 本地命令 创建版本库 建立一个本地版本库 git init 将当前目录纳入到版本控制 git init demo 会在当前文件夹下创建demo目录,并将demo目录纳入纳入到版本控制 从远处克隆一个版本库 git clone git://github.com/git/hello-world.git --会在当期远程仓库同名的文件夹,复制远程文件,并纳入到版本控制 跟踪新文件或将文件添加到暂存区 git add a.txt 将当前路径下的a.txt添加到暂存区 git add . 将当前路径下的所有文件添加到暂存区 注意: 如果add后有修改了文件,这时应该再次add,否则commit的是上一次add后的内容 提交(将暂存区中的文件提交) git commit -m "这是提交描述信息" 描述信息是必须的 git commit -a -m "这是提交描述信息" 先将文件添加到提交列表,再提交 查看文件状态(未跟踪的,已修改的,暂存区的,冲突的) git status 版本 在Git中,用HEAD表示当前版本 上一个版本就是HEAD^或HEAD~1 上一百个版本就是HEAD~100(存在分支合并的情况比较特殊) 比较修改 git diff 比较本地工作空间和暂存区 git diff --staged 比较暂存区和本地版本仓库 git diff --cached 比较暂存区和本地版本仓库 git diff head 比较本地工作空间和本地版本仓库 git diff head^ head 比较上上次提交和上一次提交的区别 git diff 哈希 哈希 比较两个历史版本之间的差异 撤销回复操作 撤销未提交的操作 撤销工作空间的更改(一般指未提交到暂存区) git checkout . 将当前目录下的所有修改过的文件回退到最近提交或添加到暂存区的状态 git checkout --filename 将指定filename的文件回退到最近提交或添加到暂存区的状态 撤销暂存区的更改(不会撤销工作空间的更改) git reset HEAD 文件名称 将某个文件从暂存区中去除 git reset HEAD 清空暂存区 撤销提交的操作(存在日志,必须保证暂存区为空) git revert HEAD 撤销最近一次的提交 git revert 哈希值 撤销到指定哈希值的提交前 回复提交的操作(不存在日志) git reset --hard HEAD^ 回复到上上次提交 git reset -–hard 哈希值 回复到指定哈希值的版本 回复的模式说明 --hard 回复暂存区和工作空间,并把head指向回复的版本 --soft 把head指向回复的版本,将差异保留 --mixed 回复暂存区(默认模式) 注意:把head指向回复的版本意味着log也会被清除,可使用git reflog找到所有操作的哈希值进行回复 撤销和回复的区别 撤销是反向进行一次提交,会保留原来的提交记录,并添加新的一条提交记录 回复是丢弃掉原来的部分提交,原来的提交日志也丢失了 撤销提交的操作时需要保证暂存区为空 查看提交历史 git log 查看提交历史,可查看版本,提交人,提交时间 git log -n 显示前n条记录 git log 文件名 显示指定文件的提交记录 git log --committer=提交人 显示指定提交人的提交记录 git log --pretty=oneline 简洁,只显示哈希值和注释 git log --pretty=format:"%h,%cd,%an,%s" --date=iso --name-only 查看操作历史 git reflog 查看操作历史,可查看版本,操作类型,操作描述 删除文件 git rm 文件 删除文件,未提交时可通过git checkout --文件 恢复 git rm --cached 文件 在版本库和暂存区中删除文件,使文件变为未跟踪状态 注意: 手动删除文件(rm)并提交不会向版本库提交删除命令,需使用 git rm 或 git add . -all 需要忽略的文件 忽略未添加到版本控制的文件 在.git文件夹同目录添加.gitignore文件,在其中写入需要忽略的文件或目录名称,每行一个,也可以写上.gitignore本身 格式规范如下: 所有空行或者以注释符号#开头的行都会被忽略。 可以使用标准的 glob 模式匹配。 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符; 问号(?)只匹配一个任意字符; [abc],[a-z] 匹配一个在方括号中的字符; 示例 # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a 除外 /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略所有build文件夹下的文件 aaa # 忽略所有的aaa文件或文件夹 doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt 保存但不提交(Stashing) 保存 git stash 查看 git stash list 查看所有保存点 回复 git stash apply 回复到最近的保存点(不回复暂存区,暂存区的更改在工作空间中,暂存区为空) git stash apply --index 回复到最近的保存点(同时回复暂存区) git stash apply stash@{版本} 回复到指定版本 git stash pop 回复最近一个保存点并删除保存点 git stash branch 创建新分支,恢复到保存时的代码(删除之后的提交,删除本次保存点) 删除 git stash drop 删除最近的一个保存点 远程命令 本地仓库和远程仓库之间的传输是通过SSH加密的,需要先创建SSH Key ssh-keygen -t rsa -C "邮箱" 克隆远程版本库 git clone 地址 本地版本库与远程仓库建立联系 git remote add origin git地址 查看远程版本仓库信息 git remote 查看远程版本仓库名称 git remote -v 查看远程版本仓库的路径 从远程版本仓库拉取代码 git fetch 从远程版本仓库拉取代码,更新本地的远程分支,不会和本地分支合并(可以看到这段时间远端提交的日志) git pull 从远程版本仓库拉取代码,自动与本地分支合并(相当于fetch + merge) 向远程版本仓库提交代码 git push 从当前主线代码向远程版本仓库提交 git push 远程仓库名称 本地分支名称 从指定分支向远程版本仓库提交 分支命令 提交对象结构 commit tree 记录所有修改文件 文件对象1 修改文件的快照 文件对象2 修改文件的快照 parent 上一次的提交对象 author 修改人 committer 提交人 ... 提交对象主要分为三部分 修改文件的快照索引 其它提交相关信息 上一次提交对象的引用(可以没有[第一次提交],可以有一个[正常提交],可以有多个[分支合并]) 分支 分支其实就是从某个提交对象往回看的历史 分支的指针在每次提交的时候都会自动向前移动 默认存在一个master分支 创建分支就是创建一个指针,然后指向某个提交对象 存在一个特殊指针:HEAD,指向当前正在使用的分支 切换分支就是将HEAD指向要切换到的指针,并切换修改文件的文件快照 Git 的实现与项目复杂度无关,它永远可以在几毫秒的时间内完成分支的创建和切换 创建分支 git branch 分支名称 //会在当前commit对象上新建一个分支指针 注意: 创建分支并不会自动切换分支,当前还在原来的分支 查看分支 git branch 查看本地分支,前面存在*号的表示是当前分支 git branch -r 查看远程分支 git branch -v 查看本地分支最后一次提交对象的信息 切换分支 git checkout 分支名称 切换到指定分支 git checkout -b 分支名称 切换到指定分支(如果不存在则根据当前分支自动创建) git checkout -b 分支名称 哈希值 切换到指定分支(如果不存在则根据当前分支指定提交自动创建) git checkout -b 分支名称 远程分支 切换到指定分支(如果不存在则根据远程分支自动创建) 删除分支 git branch -d 分支名称 删除本地分支 远程分支和跟踪分支(跟踪分支每次pull会自动合并) git config --list 可查看本地分支跟踪的远程分支 git branch -u 远程名称/远程分支名称 可修改本地分支跟踪的远程分支 比较两个分支的差异 git diff 分支1 分支2 合并分支 git merge 要合并的分支名称 将指定的分支合并到当前分支 git rebase 要应用补丁的分支名称 将当前分支的提交作为补丁应用在指定分支上 merge和rebase的区别 merge会将双方的差异进行合并 rebase会将当前分支上进行的特有操作(补丁)在要合并的分支上重新进行一次 merge的提交记录可看出是分支合并,2-->1 rebase的提交记录看不出只能看到一条分支,就像一次普通提交一样 merge由接收补丁的人进行合并 rebase由提交补丁的人进行合并 示例: 如test的提交要合并到master rebase通常操作 git checkout test git checkout -b temp git rebase master git checkout master git merge temp git branch -d temp merge常用操作 git checkout master git merge test 合并的三个模式 Fast forward(快进) 当待合并的2个branch最近的commit是线性关系时 或者说,某个branch自上次更新后没有commit信息时 git则直接移动指针即可,并没有真正的merge操作,也没有对应的merge commit信息 Merge made by recursive(递归合并) 当要合并的2个branch的最近的commit对应的直接祖先不同时 git就无法通过简单的移动指针来进行合并 只能以2个branch的最新commit和他们的共同祖先进行一次merge 并对应有一个merge commit信息 Conflict(冲突) 当2个branch都修改了同一个文件的同一部分时 这时,就会发生冲突,git的自动合并就会失败 冲突解决步骤(git merge) git status 查看冲突文件 手动合并 git add 添加到暂存区(用此方法标记为已解决) git commit 提交 或取消合并并还原到合并前的状态(git merge --abort) 冲突解决步骤(git rebase) git status 查看冲突文件 手动合并 git add 添加到暂存区(用此方法标记为已解决) git rebase --continue 继续应用后面的补丁 或取消合并并还原到合并前的状态(git rebase --abort) 合并分支(合并部分提交) 将某次提交应用到当前分支 git cherry-pick 哈希值 将某些连续提交应用到分支 示例: 如test的提交c1~c2要合并到master git checkout test git checkout -b temp c2哈希值 git rebase --onto master c1哈希值^ git checkout master git merge temp git branch -d temp 其它 git mergetool 可自动调用合并工具进行合并冲突 git配置文件 类型 系统级:对所有用户所有仓库有效(%Git%/etc/gitconfig) 全局级:对某个用户所有仓库有效(c:/users/用户/.gitconfig) 仓库级:对某个用户某个仓库有效(%仓库%/.git/.config) 命令 git config [–-local|–-global|–-system] 命令 查看全部 git config --list 查看单个 git config user.name 添加/修改 git config user.name likaihao 删除 git config --unset user.name git bash中文乱码 ls etc\git-completion.bash文件中增加以下内容:alias ls='ls --show-control-chars --color=auto' 文件名或日志 git config --system core.quotepath false 可以输入中文 etc\inputrc文件中增加以下内容:set output-meta on 和 set convert-meta off 日志 git config --global gui.encoding utf-8 git config --global i18n.commitencoding utf-8 记住密码 git config credential.helper store 提交任务的基本流程 情景: 经过一段时间的开发,任务完成,任务开发过程中没有进行拉取远端的代码 ------------------------------------------- 先不要提交, 先获取远端的代码(fetch), 如果没有获取到代码,则commit + push 如果获取到代码, 则进入eclipse的同步视图(右键-->team-->Synchronize Workspace), 查看是否存在冲突 如果没有冲突, 则拉取(pull), 并commit+push 如果存在冲突, 需要解决冲突... ------------------------------------------- 如果本地已经提交, 先获取远端的代码(fetch), 如果没有获取到代码,则commit + push 如果获取到代码, 则进入eclipse的同步视图(右键-->team-->Synchronize Workspace), 查看是否存在冲突 如果没有冲突, 需要撤销本地本次提交(reset --soft),将更改放到工作空间,然后拉取(pull),并commit+push 如果存在冲突... -------------------------------------------
git
最新推荐文章于 2023-08-30 17:21:10 发布