你的‘为什么git创建版本库时 没有在git 更新单个文件夹夹下自动生成.gitgit 更新单个文件夹夹?’怎么解决的呀?回复人的方法没有效

git的基本用法 - BCDS的一群疯子 - ITeye技术网站
(edit by king)现在一直使用git作为版本管理软件,原来在家里的龙芯电脑上搭建了个gitosis(搭建过程可以看我的个人博客:
但是家里一般不会老是开着这台电脑,而且外网ip地址也会变化,所以今天去gitorious上申请了个帐号,尝试着把本地写的代码push到gitorious 上面去。
这里描述下整个使用过程。从本地创建git仓库开始。
先在一个文件夹(这里是image_creator)中执行
,这样就会在文件夹中初始化一个git的仓库。具体初始化的内容,可以看这个文件夹里面的.git文件夹。初始化完之后,就可以添加文件了。写了写代码,保存到这个image_creator目录中,然后执行
将目录下的所有文件加入到版本管理,当然这里也可以一个个手工添加。在批量添加的时候,可能会遇到的问题,就是一些不需要版本管理的文件(如编译产生的执行文件和对象文件,一些ide的项目管理文件等),可以编辑.git目录里面info/exclude文件,在里面添加不需要版本管理的文件名。如果需要全局配置,可以在创建一个文件(如在主目录下创建.gitignore),在里面写入不需要版本控制的文件名形式,并执行
git config --global core.excludesfile=XXX
创建一个全局的设置。
扯远了,添加了文件之后,就可以提交了。提交的命令和svn类似
git commit -a -m "message"
觉得每次打commit太长了?git可以通过设置alias来创建命令的别名,同样是使用git config命令。其实git config命令就是在根据输入的值,编辑~/.gitconfig文件而已,所以这里贴下我的alias配置:
st = status
co = checkout
ci = commit
这样用起来是不是和svn差不多了呢。
现在已经可以编辑和提交代码了,对于版本管理软件来说,创建分支也是非常必要的。git对于分支的管理非常方便,相对svn,git创建分支的代价非常小。直接使用
git branch BRANCK_NAME
就可以创建新的分支,如果不带后面的分支名,git会列出所有在本地的分支。要使用这些分支,还需要一步,那就是检出
git checkout BRANCK_NAME
不知道为什么这个操作要叫checkout,是像让用svn的人更加适应?这个操作看来更像是在切换分支。经过了这个步骤,本地代码就变成了指定分支中的了,直接提交只会被提交到分支上。要将代码合并到主干,操作和svn类似,使用git merge操作。merge操作用的还不够精,具体用法还是自己去看文档吧。
git同样也支持创建tag,用法也非常简单。同时,git还支持使用git archive将分支(tag)进行归档,创建一个压缩包,这个压缩包将会去除.git文件夹。
本地的基本用法介绍完了,现在说下远程的。(事先需要将本地的ssh公钥内容上传到gitorious的ssh管理中,这样才能够进行身份认证。)在gitorious上创建一个项目,并在项目中添加一个仓库后,上面会提供一个push的地址,同时也有用法提示:
git remote add origin git@gitorious.org:image-creator/image-creator.git
git push origin master
这样会在本地的配置文件中配置远程地址,通过git的push命令,将本地的版本库上传到服务器上。别人需要复制这个项目的仓库时,只需要执行:
git clone git://gitorious.org/image-creator/image-creator.git
就能够将整个仓库复制到本地。和svn的最大不同就在于此,git复制了整个仓库的版本历史,不像svn那样只有一个工作目录。要将本地的分支也push到服务器上去,只要执行:
git push origin BRANCK_NAME
就可以了,这个也同样适用于tag。
最后,说下用了一段时间的git,相比svn它的优势有:
可以复制整个仓库,在本地可以随时提交代码。即使长时间不能连接到代码服务器,可以在本地进行版本控制。
在clone, push, pull的过程中,都会将要传输的内容进行打包。一般代码都是小文件,文件多了,即使网速再快,还是会感觉传输速度很慢,打包以后再传输,可以很好的解决这个问题。
前面一篇博客提到的那个小工具,现在托管在
浏览 14692
浏览: 43047 次
来自: 杭州
试了几次都是EMMA: [0 class(es) instru ...
[b]:idea:[/b]
您好,请问使用命令爆出一个这样的错怎么回事啊?total cl ...
请问一下,我成功发送了一个会议邀请,怎么取消会议邀请,怎么更改 ...
本人是初学者 ,请发送全部代码,sendEventEmail中 ...您现在正在浏览:
当git仓库checkout出现文件消失的处理方法
发布时间:
14:58:45 &
浏览次数:
摘要: 今天复制了一个Linux内核的git仓库,直接将.git文件夹放在了一个文件夹中,然后执行了git checkout***,...
当git仓库checkout出现文件消失的处理方法-tekkamanninja-ChinaUnix博客
Tekkaman Ninja
Linux我的梦想,我的未来! 本博客的原创文章的内容会不定期更新或修正错误!转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkamanninja.blog.chinaunix.net ,谢谢合作!!!拒绝一切广告性质的评论,一经发现立即举报并删除!
今天复制了一个Linux内核的git仓库,直接将.git文件夹放在了一个文件夹中,然后执行了git checkout ***, 检出了一个tag中的代码快照。但是怪事发生了,出现了一大堆类似“D
usr/Makefile”。让后我看了下工作目录,里面只有几个文件夹,也就是只检出了一部分文件。这时我用“git status”一看,出现一堆类似“#deleted:
usr/Makefile”的信息:
# On branch ******
# Changes not staged for commit:
#
(use &git add/rm &file&...& to update what will be committed)
#
(use &git checkout -- &file&...& to discard changes in working directory)
#
#deleted: usr/Makefile
......
#
no changes added to commit (use &git add& and/or &git commit -a&)
从这些情况上来看,当前应该类似“checkout后又人为删除了一大堆文件,并没有暂存一样”,但是为什么会这样,暂时搞不明白。这种情况我的一个同事也遇到过,当时以为是他拷贝的仓库有问题,或者文件系统的问题,没有仔细弄。现在有碰到这个问题,看来就不能这么解释了,首先仓库是我用tar打包的,并且来源都是EXT3文件系统。原因搞不明白,但是可以解决这个问题。有两种方法(命令)可以解决:
1、使用reset命令
git reset --hard
运行结果类似:
tekkaman@Super-MAGI:~/development/Ti/linux-omap3$ git reset --hard
Checking out files: 100% (), done.
HEAD is now at ****
这么一来所有文件都出来了。
对于这条命令的解释就是:
--hard
Resets the index and working tree. Any changes to tracked files in the working tree since &commit& are discarded.
复位暂存文件和工作目录树。工作目录树中任何已跟踪文件从上个&commit&点的改变都会被丢弃。
2、使用stash命令
git stash
这么一来所有文件都出来了,之后你再删除这个stash就好了。这个方法比较蹩脚,但是It works!转载请保留出处:/dotnet/679.html
本周技术实现排行维基百科,自由的百科全书
Git是一个分布式/软件,原是Linux内核開發者(Linus Torvalds)为更好地管理开发而设计。应注意的是,这与GNU Interactive Tools(一个类似界面的)有所不同。
Git最初的开发动力来自于和。Git最初只是作为一个可以被其他前端(比如Cogito或StGIT)包装的后端而开发的,但后来Git内核已经成熟到可以独立地用作版本控制。很多著名的软件都使用Git进行版本控制,其中包括、和内核等项目的开发流程。
自嘲地取了這個名字“”,读音为英语发音:( ),該詞源自英國俚語,意思大約是「混帳」。
I'm an egotistical bastard, and I name all my projects after myself. First , now git.
Git的官方维基也給出了多種關於這個名字的解释。
自2002年開始,決定使用作為主要的版本控制系統,以此來维护程式碼。2005年,BitKeeper的著作權擁有者,,宣稱曾試著以逆向工程手法來解析BitKeeper內部使用的協定,因此決定收回使用BitKeeper的授權。Linux內核開發團隊與BitMover公司進行蹉商,但無法解決他們之間的歧見,決定自行開發版本控制系統,來替代BitKeeper,於是編寫出git。
Git是用于Linux内核开发的版本控制工具。与、一類的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以運作版本控制,使得源代码的发布和交流极其方便。Git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。Git最为出色的是它的合并追踪(merge tracing)能力。
实际上内核开发团队决定开始开发和使用Git来作为内核开发的版本控制系统的时候,世界上开源社群的反对声音不少,最大的理由是Git太艰涩难懂,从Git的内部工作机制来说,的确是这样。但是随着开发的深入,Git的正常使用都由一些友善的命令稿来执行,使Git变得非常好用。现在,越来越多的著名项目采用Git来管理项目开发,例如:、等。
作为开源自由原教旨主义项目,Git没有对版本库的浏览和修改做任何的权限限制,通过其他工具也可以达到有限的权限控制,比如:gitosis、CodeBeamer MR。原本Git的使用范围只适用于Linux/Unix平台,但在Windows平台下的使用也日渐成熟,這主要归功于、环境,以及这样易用的GUI工具。Git的源代码中也已经加入了对Cygwin与编译环境的支援且逐漸完善,為Windows使用者帶來福音。
Git和其他(如)有不少的差别,Git本身关心檔案的整体性是否有改變,但多數的CVS或系统則在乎檔案内容的差异。因此Git更像一個檔案系统,直接在本機上取得資料,不必連線到主机端获取資料。
hooks:存儲鉤子的文件夾
logs:存儲日誌的文件夾
refs:存儲指向各個分支的指針(SHA-1标识)文件
objects:存放git對象
config:存放各種設置文檔
HEAD:指向當前所在分支的指針文件路徑,一般指向refs下的某文件
在平台上有msysgit與TortoiseGit可資利用。TortoiseGit還提供有。
现在git也提供windows版本下载。
有不少的專案目前都使用Git:
(music typesetting)
Music Production Software
以下是部分知名的支持Git的源码存取服务:
Hamano, Junio. . kernel mailing list.
Junio C Hamano. . .
Linus Torvalds.
Git wiki]. linux-kernel mailing list. . "Some historical background" on git's predecessors
Linus Torvalds. . linux-kernel mailing list. .
Linus Torvalds. . linux-kernel mailing list.
Linus Torvalds. . git mailing list. .
OLPC wiki. . .
. Oxford Learner's Dictionaries.
“a person, especially a man, who is stupid or unpleasant”(愚蠢或令人不爽的人,尤指男人)
. InfoWorld.
. Btrfs.wiki.kernel.org. .
. Ffmpeg.org. .
Lucas Rocha. . . "GNOME to migrate to git version control system..."
OLPC wiki. . .
Léon Brocard. . . "The Perl Foundation has migrated Perl 5 to the Git version control system..."
PHP. . PHP Group.
phpBB. . phpBB Group.
:隐藏分类:[mylove温纯]:
[美眉热图]:
[mylove温纯]:
[本站动态]:
[mylove温纯]:
使用百度网盘+git,把版本控制托管到云端
于是乎也懒得去研究SVN是否支持远程云仓库的方式来共享项目,转投最近更火的Git。Git是个好东西啊,可以直接remote到github的仓库上,不就解决了鄙人的问题么?不过github毕竟是开源的(除非你愿意每个月花几美刀去把仓库转私有),总不愿意自己公司的项目源代码随便被别人搜索到和下载吧。于是乎便使用了一个最简单的办法&&把版本控制服务(.git)托管到云服务器(网盘)上!下面来唠嗑下实现的步骤。建议您先把本文全部看完一遍再动手尝试,防止逻辑混乱。(一)首次将项目版本控制托管到云网盘上⑴ 首先你要在百度网盘这里注册个帐号: ,即使你有自己的百度帐号了,依旧建议你重新注册一个公共的帐号,毕竟项目的小伙伴们要一同使用这个百度帐号来同步.git的。注册并激活之后,在网盘里新建一个文件夹用于存放今后的同步文件,如下所示,我新建了一个叫 git 的文件夹:⑵ 接着到 /download#pan下载同步盘。下载并安装好百度同步盘后,用你注册的百度帐号登录,它会要你设置同步盘的位置,这里你随便选择一个文件夹,注意不是你项目的文件夹。如下图,我在F盘新建了一个gitbak文件夹来作为同步文件夹:⑷ 接着它会让你选择网盘上的需要同步的文件,我们勾选上之前新建的 git 文件夹,点击&确定&按钮即可:自此你就完成了需要在百度网盘上的所有操作,我们打开 F:\gitbak 文件夹看看,会发现原本是空的文件夹下多了两个文件:其中.baoche.cache 文件夹是百度云盘的数据文件夹,无需理会,而git是网盘从云端同步到我们电脑来的文件夹。只要我们修改了git文件夹里的内容,百度云网盘就会第一时间更新到云端。搞定了百度云盘,我们要接着捣弄Git了,我们续着上方步骤⑷接着讲~⑸ 没安装Git的朋友请先来 /download/下载并安装Git,安装方式很简单,各种Next即可,只是杀毒软件可能会询问是否允许该软件的操作,还是得留心下防止被阻止了。装好之后,我们打开项目文件所在的根目录(比如我的项目根目录是D:\VJProject ),右键并选择&Git Init Here&,告知Git这个文件夹需要做版本控制,然后Git就会在该目录下自动创建一个.git 文件夹用于放置版本控制信息:⑹ 我们依旧在该项目根目录里点击右键,不过这次选择的是&Git Gui&,它会打开Git图形用户操作界面,我们选择&编辑&-&选项...&:在弹出的窗口输入左右两处用户名和邮箱,再点击保存即可。此处填写的用户信息可以帮助我们以后在修改项目文件时,知道是谁做的修改:保存后我们依次点击&缓存改动&-&签名&-&提交&,此举是将改动全部保存到你本机上(项目根目录的.git文件夹里):⑺ 我们接着回到项目根目录文件夹,依旧右键,选择&Git Bash&进入命令行界面,输入命令:git clone --bare . F:/gitbak/git/VJ.git该命令是将当前文件夹的.git库拷贝到网盘同步文件夹F:/gitbak/git下,回车后如下所示:此时我们进入网盘同步文件夹F:/gitbak/git,会发现克隆成功(多了一个VJ.git文件夹):该文件夹将作为我们远程提交的库(虽然它其实是在我们本机上的,算不上远程,但别忘了它会被同步到百度云网盘上),下一步我们将在Git中添加该.git文件夹为远程仓库。⑻在项目根目录右键选择&git Gui&回到GUI主界面,我们点击&远端&-&Add&:在弹出的窗口输入本机百度云同步到的.git路径信息:(二)在其他电脑上共享云端的版本控制服务通过上述的操作,我们把Git的服务变相托管到百度云网盘上,接着说说如何在其它电脑上共享这个服务。⑴ 首先这台电脑得安装好Git,然后安装好百度云网盘,用之前注册的那个共用的百度帐号登录,然后选择要存放和同步云端文件的本机上的文件夹:并选中网盘上已有的git文件夹:点&确定&后百度同步盘就会把我们之前同步到云端的.git文件夹同步到当前电脑上:<img id="ViewPicture1_GalleryImage" src="blog
因本服务器流量限制,当前阅读话题的部分内容,请
本文地址:蓝色梦想网:
CTO排行OSCN排行1.1. Git是何方神圣?
Git是用C语言开发的分布版本控制系统。版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态)。另一个状态可以是不同的文件,也可以是不同的文件内容。举个例子,你可以将文件集合转换到两天之前的状态,或者你可以在生产代码和实验性质的代码之间进行切换。文件集合往往被称作是“源代码”。在一个分布版本控制系统中,每个人都有一份完整的源代码(包括源代码所有的历史记录信息),而且可以对这个本地的数据进行操作。分布版本控制系统不需要一个集中式的代码仓库。
当你对本地的源代码进行了修改,你可以标注他们跟下一个版本相关(将他们加到index中),然后提交到仓库中来(commit)。Git保存了所有的版本信息,所以你可以转换你的源代码到任何的历史版本。你可以对本地的仓库进行代码的提交,然后与其他的仓库进行同步。你可以使用Git来进行仓库的克隆(clone)操作,完整的复制一个已有的仓库。仓库的所有者可以通过push操作(推送变更到别处的仓库)或者Pull操作(从别处的仓库拉取变更)来同步变更。
Git支持分支功能(branch)。如果你想开发一个新的产品功能,你可以建立一个分支,对这个分支的进行修改,而不至于会影响到主支上的代码。
Git提供了命令行工具;这个教程会使用命令行。你也可以找到图形工具,譬如与Eclipse配套的EGit工具,但是这些都不会在这个教程中进行描述。
1.2. 重要的术语
表&1. Git 术语
仓库(Repository)
一个仓库包括了所有的版本信息、所有的分支和标记信息。在Git中仓库的每份拷贝都是完整的。仓库让你可以从中取得你的工作副本。
分支(Branches)
一个分支意味着一个独立的、拥有自己历史信息的代码线(code line)。你可以从已有的代码中生成一个新的分支,这个分支与剩余的分支完全独立。默认的分支往往是叫master。用户可以选择一个分支,选择一个分支叫做checkout.
标记(Tags)
一个标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态,例如号在testing分支上的代码状态
提交(Commit)
提交代码后,仓库会创建一个新的版本。这个版本可以在后续被重新获得。每次提交都包括作者和提交者,作者和提交者可以是不同的人
URl用来标识一个仓库的位置
修订(Revision)
用来表示代码的一个版本状态。Git通过用SHA1 hash算法表示的id来标识不同的版本。每一个 SHA1 id都是160位长,16进制标识的字符串.。最新的版本可以通过HEAD来获取。之前的版本可以通过&HEAD~1&来获取,以此类推。
Git 需要将代码的变化显示的与下一次提交进行关联。举个例子,如果你对一个文件继续了修改,然后想将这些修改提交到下一次提交中,你必须将这个文件提交到索引中,通过git add file命令。这样索引可以保存所有变化的快照。
新增的文件总是要显示的添加到索引中来。对于那些之前已经提交过的文件,可以在commit命令中使用-a 选项达到提交到索引的目的。
在Ubuntu上,你可以通过apt来安装git命令行工具
sudo apt-get install git-core
对于其他的Linux版本,请查看相关的软件包安装工具使用方法
msysgit项目提供了Windows版本的Git,地址是
你可以在.gitconfig文件中防止git的全局配置。文件位于用户的home目录。 上述已经提到每次提交都会保存作者和提交者的信息,这些信息都可以保存在全局配置中。
后续将会介绍配置用户信息、高亮显示和忽略特定的文件
3.1.&用户信息
通过如下命令来配置用户名和Email&
# Configure the user which will be used by git
# Of course you should use your name
git config --global user.name &Example Surname&
# Same for the email address
git config --global user.email &your.&
# Set default so that all changes are always pushed to the repository
git config --global push.default &matching&
获取Git配置信息,执行以下命令:
git config --list
3.2.&高亮显示
以下命令会为终端配置高亮
git config --global color.status auto
git config --global color.branch auto
3.3. 忽略特定的文件
可以配置Git忽略特定的文件或者是文件夹。这些配置都放在.gitignore文件中。这个文件可以存在于不同的文件夹中,可以包含不同的文件匹配模式。为了让Git忽略bin文件夹,在主目录下放置.gitignore文件,其中内容为bin。&
&同时Git也提供了全局的配置,core.excludesfile。
3.4. 使用.gitkeep来追踪空的文件夹
Git会忽略空的文件夹。如果你想版本控制包括空文件夹,根据惯例会在空文件夹下放置.gitkeep文件。其实对文件名没有特定的要求。一旦一个空文件夹下有文件后,这个文件夹就会在版本控制范围内。
4.&开始操作Git
后续将通过一个典型的Git工作流来学习。在这个过程中,你会创建一些文件、创建一个本地的Git仓库、提交你的文件到这个仓库中。这之后,你会克隆一个仓库、在仓库之间通过pull和push操作来交换代码的修改。注释(以#开头)解释了命令的具体含义
让我们打开命令行开始操作吧
4.1. 创建内容
下面创建一些文件,它们会被放到版本控制之中
#Switch to home
# Create a directory
mkdir ~/repo01
# Switch into it
# Create a new directory
mkdir datafiles
# Create a few files
touch test01
touch test02
touch test03
touch datafiles/data.txt
# Put a little text into the first file
ls &test01
4.2. 创建仓库、添加文件和提交更改
每个Git仓库都是放置在.git文件夹下.这个目录包含了仓库的所有历史记录,.git/config文件包含了仓库的本地配置。
以下将会创建一个Git仓库,添加文件倒仓库的索引中,提交更改。
# Initialize the local Git repository
# Add all (files and directories) to the Git repository
# Make a commit of your file to the local repository
git commit -m &Initial commit&
# Show the log file
4.3. diff命令与commit更改
通过git diff命令,用户可以查看更改。通过改变一个文件的内容,看看git diff命令输出什么,然后提交这个更改到仓库中
# Make some changes to the file
echo &This is a change& & test01
echo &and this is another change& & test02
# Check the changes via the diff command
# Commit the changes, -a will commit changes for modified files
# but will not add automatically new files
git commit -a -m &These are new changes&
4.4. Status, Diff&和 Commit Log
下面会向你展示仓库现有的状态以及过往的提交历史
# Make some changes in the file
echo &This is a new change& & test01
echo &and this is another new change& & test02
# See the current status of your repository
# (which files are changed / new / deleted)
git status
# Show the differences between the uncommitted files
# and the last commit in the current branch
# Add the changes to the index and commit
git add . && git commit -m &More chaanges - typo in the commit message&
# Show the history of commits in the current branch
# This starts a nice graphical view of the changes
gitk --all
4.5. 更正提交的信息 - git amend
通过git amend命令,我们可以修改最后提交的的信息
上述的提交信息中存在错误,下面会修改这个错误
git commit --amend -m &More changes - now correct&
4.6. 删除文件
如果你删除了一个在版本控制之下的文件,那么使用git add .不会在索引中删除这个文件。需要通过带-a选项的git commit命令和-A选项的git add命令来完成
# Create a file and put it under version control
touch nonsense.txt
git add . && git commit -m &a new file has been created&
# Remove the file
rm nonsense.txt
# Try standard way of committing -& will not work
git add . && git commit -m &a new file has been created&
# Now commit with the -a flag
git commit -a -m &File nonsense.txt is now removed&
# Alternatively you could add deleted files to the staging index via
git add -A .
git commit -m &File nonsense.txt is now removed&
5.&远端仓库(remote repositories)
5.1. 设置一个远端的Git仓库
我们将创建一个远端的Git仓库。这个仓库可以存储在本地或者是网络上。
远端Git仓库和标准的Git仓库有如下差别:一个标准的Git仓库包括了源代码和历史信息记录。我们可以直接在这个基础上修改代码,因为它已经包含了一个工作副本。但是远端仓库没有包括工作副本,只包括了历史信息。可以使用--bare选项来创建一个这样的仓库。
为了方便起见,示例中的仓库创建在本地文件系统上&
# Switch to the first repository
cd ~/repo01
git clone --bare . ../remote-repository.git
# Check the content, it is identical to the .git directory in repo01
ls ~/remote-repository.git
5.2. 推送更改到其他的仓库
做一些更改,然后将这些更改从你的第一个仓库推送到一个远端仓库&
# Make some changes in the first repository
cd ~/repo01
# Make some changes in the file
echo &Hello, hello. Turn your radio on& & test01
echo &Bye, bye. Turn your radio off& & test02
# Commit the changes, -a will commit changes for modified files
# but will not add automatically new files
git commit -a -m &Some changes&
# Push the changes
git push ../remote-repository.git
5.3. 添加远端仓库
除了通过完整的URL来访问Git仓库外,还可以通过git remote add命令为仓库添加一个短名称。当你克隆了一个仓库以后,origin表示所克隆的原始仓库。即使我们从零开始,这个名称也存在。&
# Add ../remote-repository.git with the name origin
git remote add origin ../remote-repository.git
# Again some changes
echo &I added a remote repo& & test02
git commit -a -m &This is a test for the new remote origin&
# If you do not label a repository it will push to origin
git push origin
5.4. 显示已有的远端仓库
通过以下命令查看已经存在的远端仓库&
# Show the existing defined remote repositories
git remote
5.5. 克隆仓库
通过以下命令在新的目录下创建一个新的仓库&
# Switch to home
# Make new directory
mkdir repo02
# Switch to new directory
cd ~/repo02
git clone ../remote-repository.git .
5.6. 拉取(Pull)更改
通过拉取,可以从其他的仓库中获取最新的更改。在第二个仓库中,做一些更改,然后将更改推送到远端的仓库中。然后第一个仓库拉取这些更改&
# Switch to home
# Switch to second directory
cd ~/repo02
# Make changes
echo &A change& & test01
git commit -a -m &A change&
# Push changes to remote repository
# Origin is automatically maintained as we cloned from this repository
git push origin
# Switch to the first repository and pull in the changes
cd ~/repo01
git pull ../remote-repository.git/
# Check the changes
less test01
6. 还原更改
如果在你的工作副本中,你创建了不想被提交的文件,你可以丢弃它。&
# Create a new file with content
touch test04
echo &this is trash& & test04
# Make a dry-run to see what would happen
# -n is the same as --dry-run
git clean -n
# Now delete
git clean -f
你可以提取老版本的代码,通过提交的ID。git log命令可以查看提交ID&
# Switch to home
cd ~/repo01
# Get the log
# Copy one of the older commits and checkout the older revision via
译者注:checkout 后加commit id就是把commit的内容复制到index和工作副本中
git checkout commit_name
如果你还未把更改加入到索引中,你也可以直接还原所有的更改&
#Some nonsense change
echo &nonsense change& & test01
# Not added to the staging index. Therefore we can
# just checkout the old version
#译者注:checkout后如果没有commit id号,就是从index中拷贝数据到工作副本,不涉及commit部分的改变
git checkout test01
# Check the result
cat test01
# Another nonsense change
echo &another nonsense change& & test01
# We add the file to the staging index
git add test01
# Restore the file in the staging index
#译者注:复制HEAD所指commit的test01文件到index中
git reset HEAD test01
# Get the old version from the staging index
#译者注:复制index中test01到工作副本中
git checkout test01
#译者注,以上两条命令可以合并为git checkout HEAD test01
也可以通过revert命令进行还原操作&
# Revert a commit
git revert commit_name
即使你删除了一个未添加到索引和提交的文件,你也可以还原出这个文件
# Delete a file
# Revert the deletion
git checkout test01
如果你已经添加一个文件到索引中,但是未提交。可以通过git reset file 命令将这个文件从索引中删除&
// Create a file
touch incorrect.txt
// Accidently add it to the index
// Remove it from the index
git reset incorrect.txt
// Delete the file
rm incorrect.txt
如果你删除了文件夹且尚未提交,可以通过以下命令来恢复这个文件夹&。译者注:即使已经提交,也可以还原
git checkout HEAD -- your_dir_to_restore
&译者注:checkout和reset这两个命令的含义是不同的,可以参阅这篇文章
Git可以使用对历史记录中的任一版本进行标记。这样在后续的版本中就能轻松的找到。一般来说,被用来标记某个发行的版本
可以通过git tag命令列出所有的标记,通过如下命令来创建一个标记和恢复到一个标记
git tag version1.6 -m 'version 1.6'
git checkout &tag_name&
8. 分支、合并
通过分支,可以创造独立的代码副本。默认的分支叫master。Git消耗很少的资源就能创建分支。Git鼓励开发人员多使用分支
下面的命令列出了所有的本地分支,当前所在的分支前带有*号
git branch
如果你还想看到远端仓库的分支,可以使用下面的命令
git branch -a
可以通过下面的命令来创建一个新的分支
# Syntax: git branch &name& &hash&
# &hash& in the above is optional
# if not specified the last commit will be used
# If specified the corresponding commit will be used
git branch testing
# Switch to your new branch
git checkout testing
# Some changes
echo &Cool new feature in this branch& & test01
git commit -a -m &new feature&
# Switch to the master branch
git checkout master
# Check that the content of test01 is the old one
cat test01
通过Merge我们可以合并两个不同分支的结果。Merge通过所谓的三路合并来完成。分别来自两个分支的最新commit和两个分支的最新公共commit
可以通过如下的命令进行合并&
# Syntax: git merge &branch-name&
git merge testing
一旦合并发生了冲突,Git会标志出来,开发人员需要手工的去解决这些冲突。解决冲突以后,就可以将文件添加到索引中,然后提交更改
8.3. 删除分支
删除分支的命令如下:&
#Delete branch testing
git branch -d testing
# Check if branch has been deleted
git branch
8.4. 推送(push)一个分支到远端仓库
默认的,Git只会推送匹配的分支的远端仓库。这意味在使用git push命令默认推送你的分支之前,需要手工的推送一次这个分支。&
# Push testing branch to remote repository
git push origin testing
# Switch to the testing branch
git checkout testing
# Some changes
echo &News for you& & test01
git commit -a -m &new feature in branch&
# Push all including branch
通过这种方式,你可以确定哪些分支对于其他仓库是可见的,而哪些只是本地的分支&&
9. 解决合并冲突
如果两个不同的开发人员对同一个文件进行了修改,那么合并冲突就会发生。而Git没有智能到自动解决合并两个修改
在这一节中,我们会首先制造一个合并冲突,然后解决它,并应用到Git仓库中
下面会产生一个合并冲突&
# Switch to the first directory
cd ~/repo01
# Make changes
touch mergeconflict.txt
echo &Change in the first repository& & mergeconflict.txt
# Stage and commit
git add . && git commit -a -m &Will create merge conflict 1&
# Switch to the second directory
cd ~/repo02
# Make changes
touch mergeconflict.txt
echo &Change in the second repository& & mergeconflict.txt
# Stage and commit
git add . && git commit -a -m &Will create merge conflict 2&
# Push to the master repository
# Now try to push from the first directory
# Switch to the first directory
cd ~/repo01
# Try to push --& you will get an error message
# Get the changes
git pull origin master
Git将冲突放在收到影响的文件中,文件内容如下:&
&&&&&&& HEAD
Change in the first repository
Change in the second repository
&&&&&&& bebfd10d8a9ca27c85f8
上面部分是你的本地仓库,下面部分是远端仓库。现在编辑这个文件,然后commit更改。另外的,你可以使用git mergetool命令
# Either edit the file manually or use
git mergetool
# You will be prompted to select which merge tool you want to use
# For example on Ubuntu you can use the tool &meld&
merging the changes manually, commit them
git commit -m &merged changes&
10. 变基(Rebase)
10.1. 在同一分支中应用Rebase Commit
通过rebase命令可以合并多个commit为一个。这样用户push更改到远端仓库的时候就可以先修改commit历史
接下来我们将创建多个commit,然后再将它们rebase成一个commit
# Create a new file
touch rebase.txt
# Add it to git
git add . && git commit -m &rebase.txt added to index&
# Do some silly changes and commit
echo &content& && rebase.txt
git add . && git commit -m &added content&
echo & more content& && rebase.txt
git add . && git commit -m &added more content&
echo & more content& && rebase.txt
git add . && git commit -m &added more content&
echo & more content& && rebase.txt
git add . && git commit -m &added more content&
echo & more content& && rebase.txt
git add . && git commit -m &added more content&
echo & more content& && rebase.txt
git add . && git commit -m &added more content&
# Check the git log message
我们合并最后的七个commit。你可以通过如下的命令交互的完成
git rebase -i HEAD~7
&这个命令会打开编辑器让你修改commit的信息或者&squash/
fixup最后一个信息
Squash会合并commit信息而fixup会忽略commit信息(待理解)
10.2. Rebasing多个分支
你也可以对两个分支进行rebase操作。如下所述,merge命令合并两个分支的更改。rebase命令为一个分支的更改生成一个补丁,然后应用这个补丁到另一分支中
使用merge和rebase,最后的源代码是一样的,但是使用rebase产生的commit历史更加的少,而且历史记录看上去更加的线性
# Create new branch
git branch testing
# Checkout the branch
git checkout testing
# Make some changes
echo &This will be rebased to master& & test01
# Commit into testing branch
git commit -a -m &New feature in branch&
# Rebase the master
git rebase master
10.3.Rebase最佳实践
在push更改到其他的Git仓库之前,我们需要仔细检查本地分支的commit历史
在Git中,你可以使用本地的commit。开发人员可以利用这个功能方便的回滚本地的开发历史。但是在push之前,需要观察你的本地分支历史,是否其中有些commit历史对其他用户来说是无关的
如果所有的commit历史都跟同一个功能有关,很多情况下,你需要rebase这些commit历史为一个commit历史。
交互性的rebase主要就是做重写commit历史的任务。这样做是安全的,因为commit还没有被push到其它的仓库。这意味着commit历史只有在被push之前被修改
如果你修改然后push了一个已经在目标仓库中存在的commit历史,这看起来就像是你实现了一些别人已经实现的功能
11. 创建和应用补丁
一个补丁指的是一个包含对源代码进行修改的文本文件。你可以将这个文件发送给某人,然后他就可以应用这个补丁到他的本地仓库
下面会创建一个分支,对这个分支所一些修改,然后创建一个补丁,并应用这个补丁到master分支&
# Create a new branch
git branch mybranch
# Use this new branch
git checkout mybranch
# Make some changes
touch test05
# Change some content in an existing file
echo &New content for test01& &test01
# Commit this to the branch
git commit -a -m &First commit in the branch&
# Create a patch --& git format-patch master
git format-patch origin/master
# This created patch <span style="color:#8-First-commit-in-the-branch.patch
# Switch to the master
git checkout master
# Apply the patch
git apply <span style="color:#8-First-commit-in-the-branch.patch
# Do your normal commit in the master
git commit -a -m &Applied patch&
# Delete the patch
rm <span style="color:#8-First-commit-in-the-branch.patch
12. 定义同名命令
Git允许你设定你自己的Git命令。你可以给你自己常用的命令起一个缩写命令,或者合并几条命令道一个命令上来。
下面的例子中,定义了git add-commit&命令,这个命令合并了git add . -A&和git commit -m&命令。定义这个命令后,就可以使用git add-commit -m &message& 了.
git config --global alias.add-commit '!git add . -A && git commit'
但是非常不幸,截止写这篇文章之前,定义同名命令在msysGit中还没有支持。同名命令不能以!开始。
13. 放弃跟踪文件
有时候,你不希望某些文件或者文件夹被包含在Git仓库中。但是如果你把它们加到.gitignore文件中以后,Git会停止跟踪这个文件。但是它不会将这个文件从仓库中删除。这导致了文件或者文件夹的最后一个版本还是存在于仓库中。为了取消跟踪这些文件或者文件夹,你可以使用如下的命令
# Remove directory .metadata from git repo
git rm -r --cached .metadata
# Remove file test.txt from repo
git rm --cached test.txt
这样做不会将这些文件从commit历史中去掉。如果你想将这些文件从commit历史中去掉,可以参考git filter-branch命令
14. 其他有用的命令
下面列出了在日常工作中非常有用的Git命令
Table 2.&有用的Git命令
git blame filename
谁创建了或者是修改了这个文件
git checkout -b mybranch master~1
以上上个commit信息为起点,创建一条新的分支
15. 安装Git服务
如上所述,我们的操作不需要Git服务。我可以只使用文件系统或者是Git仓库的提供者,像Github或Bitbucket。但是,有时候,拥有一个自己的服务是比较方便的,在ubuntu下安装一个服务相对来说是比较容易的
确定你已经安装了ssh
apt-get install ssh
如果你还没有安装Git服务,安装它&
sudo apt-get install git-core
添加一个名为git的用户
sudo adduser git
然后使用git用户进行登陆,创建一个空的仓库
# Login to server
# to test use localhost
ssh git@IP_ADDRESS_OF_SERVER
# Create repository
git init --bare example.git
现在你就可以向远端的仓库提交变更了
mkdir gitexample
cd gitexample
touch README
git add README
git commit -m 'first commit'
git remote add origin git@IP_ADDRESS_OF_SERVER:example.git
git push origin master
16. 在线的远端仓库
16.1. 克隆远端仓库
Git支持远端的操作。Git支持多种的传输类型,Git自带的协议就叫做git。下面的的命令通过git协议从克隆一个仓库&
git clone :vogella/gitbook.git
&同样的,你可以通过http协议来克隆仓库&
# The following will clone via HTTP
git clone http:///vogella/gitbook.git
16.2. 添加远端仓库
如果你克隆了一个远端仓库,那么原先的仓库就叫做origin
你可以push修改到origin中,通过 git push origin 命令. 当然,push到一个远端的仓库需要对仓库的写权限
你可以通过git remote add name gitrepo 命令添加多个仓库。例如,你可以通过http协议再次添加之前clone过来的仓库:
// Add the https protocol
git remote add githttp https:///vogella/gitbook.git
16.3. 通过http和代理服务器进行远端操作
如果你的防火墙屏蔽了出http以外的所有协议,那么使用http协议来获取仓库是非常好的方法。.
Git同样支持通过代理服务器使用http协议。下面的Git命令会展示这一点。你可以为所有的程序设置代理服务器或者只是为Git服务提供。
下面的例子用到了环境变量
export http_proxy=http://proxy:8080
# On Windows
# Set http_proxy=http://proxy:8080
git clone http://dev.eclipse.org/git/org.eclipse.jface/org.eclipse.jface.snippets.git
# Push back to the origin using http
git push origin
下面的例子只是用到了Git的配置
// Set proxy for git globally
git config --global http.proxy http://proxy:8080
// To check the proxy settings
git config --get http.proxy
// Just in case you need to you can also revoke the proxy settings
git config --global --unset http.proxy
17. Git服务提供商
除了假设自己的服务,你也可以使用Git服务提供商提供的服务。最流行的Git服务提供网站是GitHub和Bitbucket。它们都提供了有限制的免费服务
17.1. GitHub
可以通过& 访问GitHub. GitHub上所有的公开仓库都是免费的。如果你想在上面使用私有的仓库,那么就需要付费给GitHub
GitHub需要你创建ssh的公钥私钥。生成一份Ubuntu的公钥私钥可以访问&,Windows环境可以访问.
在GitHub上创建一个账户和一个仓库以后。你会收到如何将你的项目上传到GitHUb的指南,其中的命令大致如下:&
Global setup:
Set up git
git config --global user.name &Your Name&
git config --global user.email your.
Next steps:
mkdir gitbook
cd gitbook
touch README
git add README
git commit -m 'first commit'
git remote add origin :vogella/gitbook.git
git push -u origin master
Existing Git Repo?
cd existing_git_repo
git remote add origin :vogella/gitbook.git
git push -u origin master
17.2. Bitbucket
访问Bitbucket. Bitbucket 提供了无限制了公共仓库和只能有五个人访问的私有仓库。如果你需要超过五个人访问私有仓库,就需要付费给Bitbucket
18. Git的图形接口
这个教程主要说明Git命令行的使用。完成了这个教程以后,你可能想要找到一个Git的图形工具
Git提供了两个图形工具。 gitk能够展示仓库的历史信息、git gui 让你可以通过编辑器来完成Git操作
Eclipse EGit 项目提供了Git与Eclipse的集成,在最新的Eclipse版本中可以找到
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:137611次
积分:2639
积分:2639
排名:第5269名
原创:115篇
转载:62篇
评论:47条
(1)(6)(5)(3)(7)(2)(3)(4)(9)(3)(6)(11)(3)(9)(2)(14)(6)(3)(25)(13)(5)(4)(1)(2)(2)(20)(9)(1)}

我要回帖

更多关于 git 文件夹 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信