git零散知识

集中式与分布式的差别:

集中式的服务器挂了所有人都挂了,因为完整仓库只存在服务器上,分布式如果github挂了你可以重新建一个服务器,然后把任何一个人的仓库clone过去

一句话总结:分布式版本控制的每个节点都是完整仓库

.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

把文件添加到版本库

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

以下内容复制了廖雪峰的博客:

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

1

2

3

4

5

6

7

8

9

10

$ git diff readme.txt

diff --git a/readme.txt b/readme.txt

index <span class="number">46</span>d49bf.<span class="number">.9247</span>db6 <span class="number">100644</span>

--- a/readme.txt

+++ b/readme.txt

<span class="decorator">@@ -1,2 +1,2 @@</span>

-Git <span class="keyword">is</span> a version control system.

+Git <span class="keyword">is</span> a distributed version control system.

Git <span class="keyword">is</span> free software.

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。

git diff是工作区和暂存区的比较

1

git diff --cached    #是暂存区(stage)和分支(master)的比较

多次对同一个文件 git add <filename>, 之后的添加会覆盖之前的。(不过git diff 可以查看之前的修改)

问题:我同事经常直接 git reset –hard 后面不跟任何版本号,这个是什么意思?

查看当前HEAD指针指向的版本号,这个查看当前版本号把人坑完了,git reset –hard会回退到你最近提交的版本上,如果你修改了工作区的内容只add了没有commit 那么使用了这个命令之后会回退到你最近一次commit的那个版本,你在工作区的修改就会丢失掉。

暂存区就没有任何内容了

这句话不妥,暂存区不是没有任何内容了,而是暂存区的内容都已经同步到了最近的一次提交,但内容还是存在的。

1

2

git diff --cached

上述命令可以对比暂存区和最近一次提交的不同

在完成一次提交之后执行 git diff –cached 返回的结果是空的,那么说明 a(已提交仓库)和 b (暂存区)是完全一样的,所以暂存区并不为空

Git是跟踪更新的,没有变化时,说是空的也是可以的

把一个文件改其中一行,再重命名,提交,git会识别出修改+重命名这个操作,而不是删文件+新文件这个操作。

  • git diff:是查看working tree与index file的差别的。 git diff –cached:是查看index file与commit的差别的。 git diff HEAD:是查看working tree和commit的差别的。(你一定没有忘记,HEAD代表的是最近的一次commit的信息)

    撤销修改:

    对于文件 myfile.txt

    ① 修改后 未add(添加到暂存区) 需要撤销修改时:
    git checkout — myfile.txt 或 手动删除工作区修改 工作区 : clean 暂存区: clean ② 修改后 add了(未commit) 再次修改文件 要撤销第二次修改时: git checkout — myfile.txt (将暂存区恢复到工作区) 暂存区有第一次的修改需要commit ③ 修改后 add了(未commit),需要撤销修改时: git reset HEAD myfile.txt (将暂存区修改删除) 此时工作区的修改还未撤销 git checkout — myfile.txt (撤销工作区修改) ④ 修改后 add并commit了,需要撤销修改时: git reset –hard HEAD^ (版本回退)**

    个人感觉是这样的: git checkout –file 就是相当于把当前缓冲区的文件覆盖到工作区 git reset 就是把版本库的文件覆盖到缓冲区

我实在是看不下去了,一会儿暂存区一会儿版本库的,请先分清概念,经过我的实验,提交代码的更改一共分2个阶段。

1).从工作目录,提交到stage。 2).从stage提交到master。

从工作目录提交到stage,需要用add或者rm命令,只提交到stage,而没有提交到master,是不会自动同步到master的。

从stage提交到master用commit命令。

退回也是要分两步,一个是从master退回到stage,然后再从stage退回到工作目录。

对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。

对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系

Git鼓励大量使用分支:因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

因为git的分支必须指向一个commit,没有任何commit就没有任何分支,提交第一个commit后git自动创建master分支

git diff 比较的是工作区与暂存区的不同
如果两者相同则不出现任何提示

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,
以及指向master的一个指针叫HEAD。
个人认为:当工作区与暂存区及分支都相对干净(commit后,又没对工作区做任何修改)时,暂存区里面存在着与分支里相同的内容,
所以此时git diff filename 不出现任何提示。

我觉得嘛,暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。。。每拿一件商品就付一次款。。。那才麻烦大了

版本回退(回退后前进): 使工作区回到之前某次commit的内容

跟踪修改:每次修改,如果不add到暂存区,那就不会加入到commit中。

撤销修改:总之,就是让这个文件回到最近一次git commit或git add时的状态。

对于文件 myfile.txt

① 修改后 未add(添加到暂存区) 需要撤销修改时:
git checkout — myfile.txt 或 手动删除工作区修改 工作区 : clean 暂存区: clean
② 修改后 add了(未commit) 再次修改文件 要撤销第二次修改时: git checkout — myfile.txt (将暂存区恢复到工作区) 暂存区有第一次的修改需要commit
③ 修改后 add了(未commit),需要撤销修改时: git reset HEAD myfile.txt (将暂存区修改删除) 此时工作区的修改还未撤销 git checkout — myfile.txt (撤销工作区修改)
④ 修改后 add并commit了,需要撤销修改时: git reset –hard HEAD^ (版本回退)**

个人感觉是这样的: git checkout –file 就是相当于把当前缓冲区的文件覆盖到工作区 git reset 就是把版本库的文件覆盖到缓冲区

删除文件:命令git checkout — readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销(重要命令)
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

PS:命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

问题:在开始安装了git后是设置了用户名和地址。
$ git config –global user.name “Your Name”
$ git config –global user.email “[email protected]”

这里创建ssh key时又需要用到了邮箱地址。
问题是,这两个的邮箱地址需要一致的吗。

不需要。config设置的只是代码提交者的信息。

分支策略:

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

分支作用:
master 分支是主分支,要时刻与远程同步,一般我们发布最新版本就用master分支
develop 分支是开发分支,团队中所有人都在这个分支上开发,所以也需要与远程同步
bug 分支一般只在本地使用来修复bug,一般不需推送远程仓库中
feature 分支是否需要推送到远程,要看是不是有几个人合作开发新功能,如果你是一个开发,那就留在本地吧
release 分支一般是系统管理,推送或抓取的分支一般与开发人员无关
other 分支大家按需求分配

时间: 2024-11-06 09:30:16

git零散知识的相关文章

Git基础知识(二)

前言 本篇是Git基础知识(一)的延续,由于篇幅原因,分成两篇. 我们重新建立一个文件夹,执行git init. 添加一个有三行aaaaa内容的git.txt文件,并commit. 分支 截止目前,我们都是在一个叫做master的分支上工作.Git允许我们创建分支去做一些其他的事儿,而不影响到你的master分支. 1. branch branch命令可以查看分支.创建分支以及删除分支. a. 查看分支 git branch 可以看到我们当前只有一个分支master,也叫主分支,*号代表当前所在

git基础知识

本文没啥难度,基本上是我照着廖雪峰的博客敲的代码,权当做篇学习笔记. git基础知识 git diff example.txt git add example.txt git commit -m 'addby XXXX' git status git log[--pretty=online]     windows上安装git客户端,到官网下载即可. 安装完成后,在开始--> GitBash ,输入下面的内容: git config --global user.name'lirl' git co

git ---理论知识

理论基础: 不要高估自己的智商,不要低估Git的能耐. 1.Git记录的 是什么? 记录每一次版本变动的内容 将每个版本独立保存 方便分支管理. 2.git的三棵树---工作区.暂存区域和Git仓库 3.Git的工作流程: Git的工作流程一般是酱紫: 在工作目录中添加.修改文件 将需要进行版本管理的文件放入暂存区域 将暂存区域的文件提交到Git仓库 Git管理的文件有三种状态: -已修改(modified) -以暂存(staged) -已提交(committed) 4.实战: 1.建立大本营

Git基础知识总结

?一.Git文件的三种状态: 已提交(committed):该文件已经被安全地保存在本地数据库中(git add 文件名) 已修改(modified):修改了某个文件,但没有提交保存(git status 查看当前状态) 已暂存(staged):已修改的文件放在下次提交时要保存的清单中(只要在 "Changes to be committed" 这行下面的,就说明是已暂存状态) 二.Git忽略某些文件(.gitignore): 一般我们总会有些文件纳入Git的管理,也不希望它们总出现在

Git基础知识(一)

前言 Git是一个开源的分布式版本控制系统.本文很多内容翻译自: https://www.codecademy.com/learn/learn-git 使用Git的第一步是下载Git,下载地址,安装时所有选项都默认选择即可. 基本工作流程 1. init 首先新建一个文件夹,进入文件夹后右击鼠标,选择git bash,敲打命令 git init git会生成一个隐藏的.git文件夹,里面的内容用于版本控制.这样便完成了git的初始化工作,后续即可进行版本控制. 2. 三个工作区的认识 初始化完了

git下的团队合作模型及git基础知识汇集

https://www.atlassian.com/git/tutorials/syncing/git-fetch Syncing svn使用单个中央库来作为开发者之间沟通的桥梁,而协同合作是通过在开发者和中央库之间传递changeset来实现的.这种情况对于GIT的协同模型是有区别的,在git下每一个开发者都拥有他们自己的整库copy.取而代之于从working copy来提交变更集到一个中央库中,git允许你在不同的repo之间分享整个分支. 下面的命令允许你管理你和其他repo之间的连接,

Git相关知识

一些有用的链接: https://www.git-scm.com/ http://nvie.com/posts/a-successful-git-branching-model/ Git开发模式: 建议至少有一个master和develop分支.master只做版本维护工作,develop用于开发.开发完成且测试通过后合并到master. 常用场景:  撤销提交到Remote的commit 如果你推送到remote的commit没有被其他人pull过,那么你可以使用 git reset --ha

git常用知识笔记

学习资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://codingnow.cn/version/212.html http://blog.jobbole.com/34503/ http://www.cnblogs.com/lwzz/archive/2013/02/23/2921426.html Git即集中式版本控制系统.mac上的安装:直接从AppStore

Git部分知识小结

首先说一句,git跟踪并管理的是修改,而非文本. 这里有一个简化的图,有助于更好的操作git. 这里有一些常用的命令,总结一下,以便日后查看. git log查看commit记录. git reset --hard HEAD^ : 用于回退到某个commit git reflog : 查看命令历史,以确定回到未来的哪个版本 git checkout --filename :当改乱了工作区某个文件的内容,想直接丢弃工作区的修改,可以用这个命令. 1.git reset HEAD filename