文章目录

    • git和svn的区别
    • git版本控制
    • git概述
      • git详解

git和svn的区别

1、Git是分布式的,而Svn不是;
2、GIT把内容按元数据方式存储,而SVN是按文件
3、分支不同:git分支切换很方便;svn分支就是版本库的另外一个目录;
4、GIT没有一个全局的版本号,而svn有,SVN的版本号实际是任何⼀个相应时间的源代码快照。
5、GIT的内容完整性要优于SVN(GIT的内容存储使⽤的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络络问题
git和svn作为两种版本控制系统,它们之间存在显著的差异。以下是它们之间的主要区别:

  1. 系统架构:
    git是分布式版本控制系统。这意味着每个开发者都可以在自己的本地机器上拥有完整的代码库(仓库)的副本,包括所有的历史记录、分支和标签。开发者可以在没有网络连接的情况下进行工作,并在准备好时推送或拉取更改。
    svn是集中化版本控制系统。它采用客户端/服务器架构,其中所有的版本信息都存储在中央服务器上,而开发者则通过客户端连接到服务器来访问和修改代码。
  2. 存储方式:
    git按照元数据方式存储数据,这意味着它只记录文件内容的变化,而不是整个文件。这使得git的存储库体积更小,并且更加高效。
    svn则是按照原始文件存储的,它会保存文件的完整副本,这可能导致存储库体积较大。
  3. 分支管理:
    git的分支操作不会影响其他开发人员。开发者可以轻松地创建、合并和删除分支,而不会干扰到其他人的工作。
    在svn中,分支是版本库中的另一个目录,并且分支的合并需要手动操作,比如使用svn propget svn:mergeinfo来确认代码是否被合并。
  4. 速度和灵活性:
    git由于其分布式特性和元数据存储方式,使得它在处理大项目时速度更快,并且更加灵活。
    svn在处理大项目时可能会受到集中化架构的限制,导致速度较慢。
  5. 安全性:
    git的分布式特性使得代码更加安全,因为每个开发者都有完整的代码库副本,即使中央服务器出现问题,也不会丢失数据。
    svn则依赖于中央服务器来存储数据,如果服务器出现问题,可能会导致数据丢失。
  6. 学习曲线:
    git由于其分布式特性和一些高级功能(如子模块、钩子、别名等),学习曲线可能较陡峭。
    svn的集中化架构和相对简单的功能使得它更容易上手。
  7. 社区支持:
    git由于其开源和广泛使用的特性,拥有庞大的社区支持和丰富的文档资源。
    svn虽然也有社区支持,但相对于git来说可能较少。
    综上所述,git和svn在系统架构、存储方式、分支管理、速度和灵活性、安全性、学习曲线以及社区支持等方面都存在显著的差异。选择哪种版本控制系统取决于具体的需求和偏好。

git版本控制

git概述

Git是一个分布式版本控制系统,由Linus Torvalds在2005年创建,旨在管理大型项目的源代码。它被广泛应用于软件开发领域,可以有效地跟踪文件的变更、协作开发以及管理项目的版本。
以下是Git的一些关键概念和功能:

  1. 分布式版本控制:
    Git是一种分布式版本控制系统,每个开发者都拥有完整的代码仓库的副本。这意味着即使在没有网络连接的情况下,开发者也可以进行版本控制操作。
  2. 本地操作:
    Git的大部分操作都是基于本地仓库进行的,包括提交、分支、合并等操作,这使得Git的操作速度非常快。
  3. 代码仓库:
    Git使用代码仓库(Repository)来存储项目的所有文件、历史记录和元数据。一个典型的Git代码仓库包括工作目录、暂存区(Staging Area)和本地仓库。
  4. 分支管理:
    Git提供了强大的分支管理功能,允许开发者轻松地创建、切换、合并和删除分支,从而支持并行开发、实验性工作和特性开发。
  5. 提交和版本控制:
    开发者可以通过提交(Commit)操作将修改保存到本地仓库中,并且每次提交都会生成一个唯一的SHA-1哈希值作为版本标识。这样可以确保每个提交的唯一性,并且可以随时回溯到任何历史版本。
  6. 远程仓库:
    Git支持与远程代码仓库进行交互,开发者可以推送(Push)本地提交到远程仓库,或者拉取(Pull)远程仓库的更新到本地仓库。
  7. 协作开发:
    Git支持多人协作开发,开发者可以共享自己的工作成果、合并他人的修改,并且可以通过分支管理来避免冲突和混乱。
  8. 标签:
    Git允许开发者对提交进行标记(Tag),从而可以方便地标识发布版本、重要里程碑或者修订号。
    总之,Git是一个强大而灵活的版本控制系统,它提供了丰富的功能和工具,使得开发者能够更好地管理和协作开发项目。虽然Git有一定的学习曲线,但一旦掌握了其核心概念和操作,就能够极大地提高团队的效率和代码管理的可靠性。

git详解

github上fork原项目,如何将本地仓库代码更新到最新版本

  1. 配置当前当前fork的仓库的原仓库地址
    git remote add upstream
  2. 查看当前仓库的远程仓库地址和原仓库地址
    git remote -v
  3. 获取原仓库的更新。使用fetch更新,fetch后会被存储在一个本地分支upstream/master上。
    git fetch upstream
  4. 合并到本地分支。切换到本地master分支,合并upstream/master分支。
    git merge upstream/master
  5. 这时候使用git log就能看到原仓库的更新了。
    git log
  6. 如果需要自己github上的fork的仓库需要保持同步更新,执行git push进行推送
    git push origin master
    git命令
    git config user.name
    git config –global user.name “liucheng9514”
    -feign
    git config –global user.name “liucheng9514”
    git remote add xxx(别名) xxxxxxx(远程仓库地址)

git remote -v 查看已经关联的远程仓库
git fetch

clone
git clone [ssh地址] 类似Download功能,就跟Windows一样将云端的仓库下载到本地电脑,可以理解成迅雷下载,可以把云端文件下载到本地电脑的当前文件夹。如下图,我先在桌面创建了一个Github的文件夹,之后在里面git clone之后就可以查看到多了一个Linux-C的文件夹,这就是git clone的作用
fork
接下来讲一下fork的作用,进入别人的项目右上角都有一个fork,相当于是把别人的项目复制到云端,注意是云端,本地电脑并没有下载,你可以在你GitHub主页的Repositories里面找到,到这里你应该已经知道两者的区别了,如果你想知道fork有什么用处就往下看,暂时不想知道或者已经知道的就可以关闭网页了。

fork有什么用
既然可以Download别人的源码为啥还要fork呢?
· 首先,我们有百度云也不一定会把百度云上的东西全都下载到本地硬盘对吧?有些东西我们需要存到云端,方便随时查看。
· 第二,Git可以多人协作完成项目,或者我写完一个项目可以开源到GitHub上,看到的小伙伴fork我的代码之后发现有BUG或者有一个地方有更好的算法可以解决,他可以在他自己的仓库里面修改源码,修改好之后他可以pull request,这样我就可以看到什么地方修改了,如果我觉得他的算法可行就可以把他的代码Merge到我的项目里面,简单说就帮我修复bug了,不用我自己动手。开源精神就是互帮互助。

现在有这样一种情形:
有一个叫做Joe的程序猿写了一个游戏程序,而你可能要去改进它。并且Joe将他的代码放在了GitHub仓库上。
下面是你要做的事情fork并且更新GitHub仓库的图表演示

  1. Fork他的仓库:这是GitHub操作,这个操作会复制Joe的仓库(包括文件,提交历史,issues,和其余一些东西)。复制后的仓库在你自己的GitHub帐号下。目前,你本地计算机对这个仓库没有任何操作。
  2. Clone你的仓库:这是Git操作。使用该操作让你发送”请给我发一份我仓库的复制文件”的命令给GitHub。现在这个仓库就会存储在你本地计算机上。
  3. 更新某些文件:现在,你可以在任何程序或者环境下更新仓库里的文件。
  4. 提交你的更改:这是Git操作。使用该操作让你发送”记录我的更改”的命令至GitHub。此操作只在你的本地计算机上完成。
  5. 将你的更改push到你的GitHub仓库:这是Git操作。使用该操作让你发送”这是我的修改”的信息给GitHub。Push操作不会自动完成,所以直到你做了push操作,GitHub才知道你的提交。
  6. 给Joe发送一个pull request:如果你认为Joe会接受你的修改,你就可以给他发送一个pull request。这是GitHub操作,使用此操作可以帮助你和Joe交流你的修改,并且询问Joe是否愿意接受你的”pull request”,当然,接不接受完全取决于他自己。
  7. 如果Joe接受了你的pull request,他将把那些修改拉到自己的仓库!

origin和upstream
Fork,本身并不是git工具中的一个命令,也不是对git的扩展,它是在GitHub上的概念,是另一种clone方式——在服务器端的clone。
而我们通常意义上的clone,是将远程repo 复制一份到本地。
当你从GitHub上 clone 一个 repo 到本地时,除非你已明确声明是这个repo的contributor,否则你是不能向其pull request的,此时,该远程的repo对于本地repo来说,就是upstream。
当你从GitHub上 fork 一个 repo 之后,再 clone forked repo 到本地,你就可以任意向其pull request,此时,远程的 repo 就是 origin。下面一段是来自 GitHub pages 的解释:
When a repo is cloned, it has a default remote called origin that points to your fork on GitHub, not the original repo it was forked from.
To keep track of the original repo, you need to add another remote named upstream
git remote add upstream git://github.com/user/repo_name.git
总结下来: 1. 如果是 upstream repo,你只可以拉取最新代码(即 git fetch ),从而保证你本地的仓库与源仓库同步 2. 如果是 origin repo,就是你自己的repo(自己创建的,或者 fork 的项目)你可以做任何推拉操作(pull and push) 3. 你可以通过 pull request 向 upstream repo 贡献代码
Referenced by {+}http://stackoverflow.com/questions/6286571/git-fork-is-git-clone+fork:在github页面,点击fork按钮。将别人的仓库复制一份到自己的仓库。
clone:将github中的仓库克隆到自己本地电脑中

pull request的作用
比如在仓库的主人(A)没有把我们添加为项目合作者的前提下,我们将A的某个仓库名为”a”的仓库clone到自己的电脑中,在自己的电脑进行修改,但是我们会发现我们没办法通过push将代码贡献到B中。
所以要想将你的代码贡献到B中,我们应该:

  1. 在A的仓库中fork项目a (此时我们自己的github就有一个一模一样的仓库a,但是URL不同)
  2. 将我们修改的代码push到自己github中的仓库B中
  3. pull request ,主人就会收到请求,并决定要不要接受你的代码
  4. 也可以可以申请为项目a的contributor,这样可以直接push
    (2) fork了别人的项目到自己的repository之后,别人的项目更新了,我们fork的项目怎么更新?
    答:首先fetch网上的更新到自己的项目上,然后再判断、merge。这里就涉及了下一个问题,pull和fetch有啥区别。
    (3)fetch+merge与pull效果一样。但是要多用fetch+merge,这样可以检查fetch下来的更新是否合适。pull直接包含了这两步操作,如果你觉得网上的更新没有问题,那直接pull也是可以的。 参考文献:1 {+}http://www.tech126.com/git-fetch-pull/+2 {+}http://www.ruanyifeng.com/blog/2014/06/git_remote.html+3 {+}http://ruby-china.org/topics/15729+4 {+}http://www.oschina.net/translate/git-fetch-and-merge+5 {+}http://www.cnblogs.com/hutaoer/archive/2013/03/14/3078869.html+

git fetch VS git pull
git fetch
相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master
git log -p master…origin/master
git merge origin/master
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:
git fetch origin master:tmp
git diff tmp
git merge tmp
从远程获取最新的版本到本地的test分支上
之后再进行比较合并

git pull
相当于是从远程获取最新版本并merge到本地
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合

新建代码库
在当前目录新建一个Git代码库
$ git init
新建一个目录,将其初始化为Git代码库
$ git init [project-name]
下载一个项目和它的整个代码历史
$ git clone [url]

配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
显示当前的Git配置
$ git config –list
#编辑Git配置文件
$ git config -e [–global]
#设置提交代码时的用户信息
$ git config [–global] user.name “[name]”
$ git config [–global] user.email “[email address]”

增加/删除文件
#添加指定文件到暂存区
$ 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]

代码提交
提交暂存区到仓库区
$ 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] …

分支
列出所有本地分支
$ 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]

标签
列出所有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]

查看信息

显示有变更的文件
$ git status
显示当前分支的版本历史
$ 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]
显示指定文件相关的每一次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 [commit]
显示某次提交发生变化的文件
$ git show –name-only [commit]
显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
显示当前分支的最近几次提交
$ git reflog
从本地master拉取代码更新当前分支:branch 一般为master
$ git rebase [branch]

远程同步

更新远程仓储
$ git remote update
下载远程仓库的所有变动
$ git fetch [remote]
显示所有远程仓库
$ git remote -v
#显示某个远程仓库的信息
$ git remote show [remote]
增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
上传本地指定分支到远程仓库
$ git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] –force
推送所有分支到远程仓库
$ git push [remote] –all

撤销
恢复暂存区的指定文件到工作区
$ git checkout [file]
恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
恢复暂存区的所有文件到工作区
$ git checkout .
重置暂存区的指定文件,与上一次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 archive

本站无任何商业行为
个人在线分享 » git版本控制
E-->