当前位置:首页 > 未命名 > 正文

git的使用教程(git实用教程)

git的使用教程(git实用教程)

在学校,或许凭借一个人的力量就能负责整个项目的开发到上线。但是在在公司,因为项目的复杂性和紧急性,一个项目的往往是由多个人实现,此时就有一个问题,代码提交和代码合并。git和svn,这篇文章来讲讲git的原理和使用

  • version版本控制
  • git的账号配置
  • 创建git仓库
  • git的原理
  • 文件操作命令
  • 分支操作命令

version版本控制

  • 版本控制(Revision control)是一种在开发的过程中用于对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份及以便恢复以前版本的技术
  • 没有进行版本控制或者版本控制本身缺乏正确的管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题

git的账号配置

  • 配置名字和邮件地址
  1. #gitconfig--globaluser.name"hellolwl"
  2. #gitconfig--globaluser.emaillwl@csc.com
  3. //查看系统config
  4. #gitconfig--system--list
  5. //查看当前用户(global)配置
  6. #gitconfig--global--list
  7. //查看当前仓库配置信息
  8. #gitconfig--local--list

创建git仓库

  1. //在当前目录新建一个Git代码库
  2. #gitinit
  3. //克隆一个项目和它的整个代码历史(版本信息)
  4. #gitclone[git@github.com:cscsss/learnHome.git]

git的原理

git的使用教程(git实用教程)

  • 项目文件(Directory):使用Git管理的一个目录,也就是一个仓库,包含我们的工作区(WorkSpace)和 Git的管理空间(.git)
  • 工作区(Workspace):就是平时存放项目代码的地方,一个文件夹而已
  • git管理空间(.git):存放Git管理信息的目录,初始化仓库的时候自动创建。里面又包含暂存区(Index/Stage)和 本地仓库(Repository)
  • 暂存区(Index/Stage):用于存放你的临时改动信息,保存即将提交到文件列表信息。可用于保存/恢复 WorkSpace 中的临时状态
  • 本地仓库(Repository):这里面存放你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • 远程仓库(Remote):托管代码的服务器,和本地仓库作用类似,不过它是公共的

状态转移流程

  • 未跟踪(Untracked): 此文件仅仅在 workspace 中,但并没有加入到 git 仓库,不参与版本控制。通过 git add 状态变为 Staged
  • 文件已经入库(Unmodify): 未修改,即版本仓库中的文件快照内容与 workspace 中完全一致。这种类型的文件有两种变化,如果它被修改,而变为 Modified。如果使用 git rm 移出版本库,则成为 Untracked 文件
  • 文件已修改(Modified): 仅仅是修改, 并没有进行其他的操作。通过 git add 可进入暂存 Staged 状态,使用 git checkout 则丢弃修改过,返回到 unmodify 状态,这个 git checkout 即从库中取出文件,覆盖当前修改
  • 暂存状态(Staged): 执行 git commit 则将修改同步到仓库中,这时库中的文件和 workspace 文件又变为一致,文件为 Unmodify 状态。执行git reset branchName fileName取消暂存。文件状态恢复为 Modified图片

git的使用教程(git实用教程)

文件操作命令

查看文件状态

  1. //查看所有文件状态
  2. #gitstatus
  3. //查看指定文件状态
  4. #gitstatus[fileName]

添加文件与目录

  1. //添加指定文件到暂存区
  2. #gitadd[file1][file2]...
  3. //添加指定目录到暂存区,包括子目录文件
  4. #gitadd[dir]

移除文件与目录

  1. //将文件从暂存区和工作区中删除
  2. #gitrm<fileName>
  3. //将fileName从暂存区删除文件,仍保留在当前工作目录中
  4. #gitrm--cached<fileName>

文件提交 git commit

  1. //将暂存区文件提交到本地仓库区,message为说明信息
  2. #gitcommit-m[message]
  3. //将暂存区的指定文件fileName提交到本地仓库
  4. #gitcommit[fileName]-m[message]
  5. //追加漏提交的暂存区文件。等价gitadd.+gitcommit-m'message'
  6. #gitcommit--amend-m[message]

查看文件状态及历史 git log

  1. #gitlog//查看提交历史
  2. #gitlog--oneline//以精简模式显示查看提交历史
  3. #gitlog-p<fileName>//查看指定文件的提交历史
  4. #gitblame<fileName>//以列表方式查看指定文件的提交历史

git diff 比较差异

  1. //显示暂存区和工作区的全部差异
  2. #gitdiff
  3. //显示filepath路径文件中,工作区与暂存区的差异
  4. #gitdifffilePath
  5. //显示在工作区filePath文件与HEAD分支的差异
  6. #gitdiffHEADfilePath
  7. //显示在工作区的filePath文件与某次提交commitId的差异
  8. #gitdiffcommitIdfilePath

git reset 代码回退

  • 有时提交了一些错误代码,我们想回滚怎么办,可以使用 git reset 重设置代码版本号。git reset 有三种模式 。soft、mixed、hard
  1. //gitreset[--soft|--mixed|--hard][HEAD]
  2. //gitreset[--soft|--mixed|--hard][commit]
  3. #gitreset–hardHEAD~3//会将最新的3次提交全部重置,就像没有提交过一样
  4. #gitreset003444c77bae2b0874be17b81a829cfb1237d9ce//重置到003444c7
  • --hard 模式

git的使用教程(git实用教程)

重置 HEAD 在当前分支到某次 commit 时,工作目录里的新改动和已经 add 到 stage 暂存区的新改动会全都消失。工作目录(workspace)、暂存区(index/stage)及本地仓库(repository)重置成目标 commit 的內容,所以效果看起来等同于清空暂存区和工作区

  • --soft 模式

git的使用教程(git实用教程)

--soft 模式在重置 HEAD 时,会保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区,保留工作目录(workspace)和暂存区(index/stage)的内容,只让 repository 中的内容和 reset 节点保持一致,原节点和 reset 节点之间的「差异变动」会放入暂存区中(index/stage)

--mixed 模式图片git reset 如果不加参数,那么默认使用 --mixed 参数。mixed 模式会保留 工作目录(workspace)的內容,但会将暂存区(index/stage) 和 Repository 中的內容重置成 reset 节点一致,因此原节点和 reset 节点之间的「差异变动」会放入工作目录(workspace)

git revert

如果我们想撤销之前的某一版本,但是又想保留 commitId 提交之后的版本

  1. #gitrevert-ncommitId

分支操作命令

新建分支

  1. //基于当前分支新建一个分支,并且切换到新的分支lwl
  2. #gitcheckout-blwl
  3. //基于远程分支originBranch并新建分支csc
  4. #gitcheckout-bcscoriginBranch
  5. //新建一个csc分支,但是仍停留在原来分支
  6. #gitbranchcsc
  7. //切换到csc分支
  8. #gitcheckoutcsc

git push

  1. ~~将本地分支的更新全部推送到远程仓库master分支
  2. #gitpushoriginmaster
  3. ~~删除远程branchname分支
  4. #gitpushorigin-d<branchName>

删除分支

  1. #gitbranch-D<branchname>
  2. ~~删除本地dev1分支
  3. #gitbranch-Ddev1

分支合并

git的使用教程(git实用教程)

git-merge 命令是用于从指定的commit(s)合并到当前分支的操作

  1. #gitmergebranchName//当前分支和branchName合并
  2. #gitmerge-m<msg><commit>//当前分支和branchNamecommit及之前的提交合并
  3. #gitmerge--abort//取消合并
  • 当产生合并冲突时,该部分会以<<<<<<<, =======和 >>>>>>>表示。在=======之前的部分是当前分支这边的情况,在=======之后的部分是对方分支的情况
  • 解决完冲突的地方后使用git add加入到index中,然后使用git commit产生合并节点

git pull/git fetch

  • git fetch 可以拉取远程仓库的代码
  1. ~~拉取所有远端的最新代码
  2. #gitfetch--all
  3. ~~拉取远程最新master分支代码(指定master分支)
  4. #gitfetchoriginmaster
  • git pull。它不仅会拉取远程分支,还会合并远端和本地代码,即:git pull = git fetch + git merge
  1. ~~拉取远程仓库分支,更新并合并到本地分支
  2. #gitpull
  3. ~~将远程master分支合并到当前本地master分支
  4. #gitpulloriginmaster
  5. ~~将远程master分支合并到当前本地lwl分支,冒号后面表示本地分支
  6. #gitpulloriginmaster:lwl

git rebase 合并

git rebase master 命令会把当前分支 curBranch 里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把 curBranch 分支更新为 master 分支最新提交,最后把保存的这些补丁应用到 curBranch 分支上

git的使用教程(git实用教程)

在 rebase 的过程中,也许会出现冲突(conflict)。在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用 git add 命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行git rebase --continue

  1. #gitrebasebranchName//branchName合并到当前分支
  2. #gitrebase--continue//解决冲突后继续合并
  3. #gitrebase--abort//取消合并
  4. #gitrebase-iHEAD~2//合并提交---2表示合并2个。也可以是3...

如果 git rebase master 之后。需要将当前分支 curBranch的代码移到 master。可以再次使用 git merge。此时合并后 master 的提交是一条线性 commit

git tag

  • tag 对应某次 commit, 是一个点,是不可移动的。branch 对应一系列commit,是很多点连成的一根线,有一个HEAD 指针,是可以依靠 HEAD 指针移动的。所以,两者的区别决定了使用方式,改动代码用 branch,不改动只查看用 tag
  • 创建 tag 是基于本地分支的 commit,而且与分支的推送是两回事,就是说分支已经推送到远程了,但是 tag 并没有,如果要把 tag 推送到远程分支上,需要另外执行 tag 的推送命令
  1. #gittag<tagName>//基于最新的commitId创建tagName
  2. #gittag-a<tagName><commitId>//基于某次commitId创建tagName
  3. #gitpushorigin<tagName>//推送到远程仓库
  4. #gitpush--tags//推送所有标签
  5. #gittag-d<tagName>//删除本地tag
  6. #gitpushorigin:refs/tags/<tagName>//删除远程tag

欢迎指正文中错误

参考文章

  • 一个小时学会Git[1]
  • 程序员必备基础:Git 命令全方位学习[2]
  • Git Reset 三种模式[3]

原文链接:https://mp.weixin.qq.com/s/KFY0oJkCffWm9jCU2DxhtA

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。