为什么我的.没有csproj文件件得到搞砸了一个Git变基后

聊聊Unity项目管理的那些事:Git
聊聊Unity项目管理的那些事:Git-flow和Unity $mpNews.postTimeAsString 0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的Git
聊聊Unity项目管理的那些事:Git-flow和Unity
$mpNews.postTimeAsString
  0x00 前言
  目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的GitFlow策略,中间有经验也有教训,所以记录在本文,既是和各位朋友交流也供自己日后查阅。
  0x01 基础:Unity项目如何做版本管理? 为什么更喜欢git?
  初来项目组到时候,项目还在使用SVN作为版本管理的工具。作为一个不喜欢SVN的人,自然而然想到了换用git来做版本管理。这里当然并不是说svn不如git好,只是它们的思路的确是不一样的。
  与SVN相比,git是一个分布式的版本管理工具。这一点可能是我喜欢git胜过svn的一个决定性原因。
  当我们使用git从远端版本库/服务器上chect out代码后,git会在自己的机器上克隆一个自己的本地版本库。这样我们在本地就实现了版本的管理,而不必像svn那样必须和服务器连接。举一个例子,当我们在本地开发自己的功能时一旦不小心有了错误的操作,我们只需要在本地进行版本回退即可。如果使用svn的话,这种问题的修改似乎就变得不那么方便了。
  喜欢git的另一个原因就是使用git的分支了。我们可以在本地的同一个工作目录下快速的切换不同的分支,每个分支之间都是隔离的。当我们不想影响主分支的时候,可以十分轻松的利用git创建一个新的分支进行开发。
  总之,使用git替换svn作为团队的新的版本管理工具之后,团队的开发效率提高了很多。
  git和Unity
  既然项目组决定采用git作为新的版本管理工具,那么首先的一点就是我们要先确认哪些文件是需要纳入版本管理的。同时,在确认需要管理的文件时,顺便重新规整一下整个项目的目录结构,不仅仅是为了更加便于git进行版本管理,同时也可以更好的维护项目。
  上图便是一个典型的Unity项目的默认目录。我们可以看到默认的Unity项目的目录下就已经有很多文件和文件夹了。
  但是,作为版本管理,我们通常只需要关注两个文件夹即可。即:Assets文件夹和ProjectSettings文件夹。
  其中,Assets文件夹主要用来存放项目的资源,例如脚本文件、贴图、材质、声音资源等等。
  而ProjectSettings文件夹则用来存放一些项目的设置,例如输入设置、物理系统的设置、Player设置、Layer、Tags等等。我们可以在Unity的编辑器中的Edit-&Project Settings菜单来调整这些设置信息。
  默认目录下的其余文件或文件夹都可以由这两个文件夹的内容生成出来。
  例如,如果Assets文件夹中包括C#脚本文件,则Unity会在目录生成C#工程文件Assembly-CSharp.csproj。
  除此之外, Unity的一些特殊的文件夹也会生成一些工程文件。例如Editor文件夹内如果有C#脚本,则会生成一个Assembly-CSharp-Editor工程文件。
  除了这些工程文件之外,Unity还会生成一些文件夹。例如Library、Temp、obj这三个文件夹。它们同样是Unity自动生成的。
  Library文件夹的内容主要是在项目中导入资源时产生的一些本地的缓存。
  Temp和obj这两个文件夹则是在项目构建时产生的临时文件。
  因此,我们可以通过git的.gitignore文件来将不需要被git管理的文件/文件夹添加到忽略列表。下面是github提供的一份适用于Unity项目的.gitignore文件列表。
  /[Ll]ibrary//[Tt]emp//[Oo]bj//[Bb]uild//[Bb]uilds//Assets/AssetStoreTools* # Autogenerated VS/MD/Consulo solution and project filesExportedObj/.consulo/*.csproj*.unityproj*.sln*.suo*.tmp*.user*.userprefs*.pidb*.booproj*.svd # Unity3D generated meta files*.pidb.meta # Unity3D Generated File On Crash Reportssysinfo.txt # Builds*.apk*.unitypackage
  除此之外,我们还需要将Unity为导入资源生成的.meta文件也纳入版本管理,和相应的资源一同维护。meta文件的重要性在于Unity会利用它来处理对应资源之间的引用关系。
  为了处理资源之间的引用关系,Unity在序列化时会通过两个数据来保证正确的引用关系。即文件GUID和以及本地ID,其中文件GUID便保存在meta文件中。
  fileFormatVersion:2guid:437eb1afce72bb44ca24c6ac3fe90c1d timeCreated:licenseType:Store NativeFormatImporter:userData:assetBundleName:assetBundleVariant:
  只要使用文本工具打开meta文件即可以看到其内容。
  另外还需要注意到的事情便是git版本管理时的文件冲突问题。通常当我们合并两个相同的地方都有修改的分支时,都会产生冲突。
  一旦git不知道如何自动合并,就需要我们来手动解决冲突了。如果文件是文本文件,git便会在有冲突的地方做上标记(如 &&&&&&& HEAD ==== &&&&&&& HASH_ID等),参考这些标记我们可以很方便的解决冲突问题。
  但是,如果文件是二进制的文件,一旦发生冲突则很难查看git插入的冲突标识,解决起来是比较棘手的。因此Unity项目的资产序列化最好生成文本文件,而不是二进制文件。我们可以在设置中选择序列化的策略。
  这样场景文件和prefab等文件就会被序列化为yaml文本文件:
人力资源师
(责任编辑:sunning)
------分隔线----------------------------
报名咨询方式
铜仁职业技术学院2017年分类考试招生报考指南...
机器人成为军队采购一级供应商 中国证券网讯(记者 唐学良)机器人6月23日晚间公告,...
据最高人民检察院网站消息,12月19日下午,广东省肇庆市首例行政公益诉讼案件在肇庆市...
2017年度投资项目管理师考试将于日9:00至日17:00报名,网上报名...
马兰欧尼时装学院ISTITUTO MARANGONI...
2015年上半年宝丰县自考准考证发放于日―17日到宝丰县教体局一楼招生服务...
2017湖北公务员考试缴费时间|入口
中国信通院发布“2017年信息通信业(ICI)十
成考VS自考哪种更适合你 过来人谈求学差异变基过程:
  两个分支
  先考虑不用变基的合并:
$ git checkout master
$ git merge experiment
  合并后:
  如果变基:(以下为变基过程)
$ git checkout experiment
$ git rebase master
conflict resolve
$ git rebase --continue
  然后再合并:
$ git checkout master
$ git merge experiment
  一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁&&例如向某个别人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到&origin/master&上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。
  上述变基过程的另一种方式:
$ git rebase master experiment
confict resolve
$ git rebase --continue
$ git checkout master
$ git merge experiment
  这样省去先切换到experiment分支的过程。即便在另一个不相关的分支,也无须去先切换到experiment分支。( git rebase [basebranch] [topicbranch] )
git rebase --onto:
  假设你希望将&client&中的修改合并到主分支并发布,但暂时并不想合并&server&中的修改,因为它们还需要经过更全面的测试。 这时,你就可以使用&git rebase&命令的&--onto&选项,选中在&client分支里但不在&server&分支里的修改(即&C8&和&C9),将它们在&master&分支上重演:  
$ git rebase --onto master server client
conflict resolve
$ git rebase --continue
  以上命令的意思是:&取出&client&分支,找出处于&client&分支和&server&分支的共同祖先之后的修改,然后把它们在&master&分支上重演一遍&。
  然后,合并:
$ git checkout master
$ git merge client
git pull --rebase:
$ git pull --rebase
  等价于:
$ git fetch
$ git rebase origin/master
阅读(...) 评论()2130人阅读
本文来源于我在InfoQ中文站翻译的文章,原文地址是:q.com/cn/news/-git-advanced-commands众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈。学习Git,首先当然是学习Git的。相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强大工具。使用Git时常用的命令有pull、commit、push等,貌似很简单。不过,有时你会遇到合并冲突的情况,Git这时会将冲突标记出来,需要你手工来解决。有时,你会不小心将代码提交到错误的分支上,并且又推送到了远程仓库。还有些时候,你需要切换到不同的分支,但Git却不让你这么做,因为还有未保存的修改。如果需要通过另一个分支的提交来为代码打补丁该怎么做呢?本文就将介绍12个Git高级命令,合理使用这些命令可以大大提升应用Git的效率。1. 使用rebase而非merge来拉取上游修改分支合并会被记录为一次合并提交,这种做法是很有意义的。比如说,可以通过这种方式来标识一个新特性被合并到了发布分支中。不过,当多个团队成员工作在一个项目中并使用常规的git pull来同步分支时,提交时间线就会被不必要的合并提交所污染。更好的做法则是使用git rebase将一个feature分支变基到master分支:$ git checkout feature
$ git rebase master
这么做会将整个feature分支移动到master分支的起点,它会合并master分支上所有新的提交。不过,相比于使用合并提交来说,变基会通过在原来的分支中为每次提交创建全新提交来重写项目历史。变基的主要好处在于你会得到一个更加整洁的项目历史。此外,这里还有关于变基的陷阱的一些讨论。2. 在执行git rebase后解决合并冲突正如能力越大责任就越大一样。在执行git rebase时,你可能会遇到合并冲突的情况。合并冲突表示两个提交修改了同一个文件的同一行,Git不知道该应用哪一个修改。这会导致如下所示的错误消息:Git会为你提供3个选择来修复导致冲突的提交(fa39187):可以运行git rebase --abort来完全取消变基。这么做会取消变基修改,并将分支置回到执行git rebase之前的状态。可以运行git rebase --skip来完全忽略该提交。这样,有问题的提交所引入的变化就不会被添加到历史中。可以使用与合并冲突相同的标准步骤来解决冲突。3. 临时性保存修改在工作进行中时,有些东西常常会处于凌乱的状态。如果这时需要切换到不同的分支该怎么办呢?Git是不允许你这么做的,因为还有尚未保存的修改。坦率地说,你并不想将半成品提交上去,后面再来修改。这个问题的解决之道就是使用git stash命令。Stash会接收工作目录的当前状态(比如说,修改了的追踪文件与暂存区的修改等),并将其保存到未完成的修改栈中,这样后面随时可以再来修改。可以通过如下命令来暂存你的工作:$ git stash
Saved working directory and index state WIP on feature: 3fc175f fix race condition
HEAD is now at 3fc175f fix race condition
现在,工作目录就是干净的了:$ git status
# On branch feature
nothing to commit, working directory clean
这时就可以安全地切换分支做别的事情了。不过不必担心,暂存的提交依旧还在:$ git stash list
stash@{0}: WIP on feature: 3fc175f fix race condition
稍后,在回到feature分支后,你就可以取回所有暂存的变更了:$ git stash pop
On branch feature
Changes not staged for commit:
(use &git add ...& to update what will be committed)
index.html
Dropped refs/stash@{0} (acba712b8e50c99a99d3c20da9d6b8)
关于暂存,还有其他一些选项可用,如下所示:$ git stash save &describe it&
# give the stash a name
$ git stash clear
# delete a stashed commit
$ git stash save --keep-index
# stash only unstaged files
4. 克隆一个特定的远程分支如果想要从远程仓库中克隆一个特定的分支该怎么做呢?通常你会使用git clone,不过这么做会将所有其他分支都一并克隆下来。一个便捷的方式是使用git remote add:$ git init
$ git remote add -t
$ git checkout
5. 将cherry-pick远程提交合并到自己的分支中更有甚者,如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中:$ git cherry-pick
6. 应用来自于不相关的本地仓库的补丁如果需要将另一个不相关的本地仓库的提交补丁应用到当前仓库该怎么做呢?答案就是下面这条命令:$ git --git-dir=/.git format-patch -k -1 --stdout
| git am -3 -k
7. 忽略追踪文件中的变更如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件:$ git update-index --assume-unchanged
8. 每隔X秒运行一次git pull通常,合并冲突出现的原因在于你正在工作的本地仓库不再反映远程仓库的当前状态。这正是我们为什么每天早晨要首先执行一次git pull的缘故。此外,你还可以在后台通过脚本(或是使用GNU Screen)每隔X秒调用一次git pull:$ screen
$ for((i=1;i&=10000;i+=1)); do sleep X && done
9. 将子目录分隔为新的仓库有时,你可能需要将Git仓库中某个特定的目录转换为一个全新的仓库。这可以通过git filter-branch来实现:$ git filter-branch --prune-empty --subdirectory-filter
# Filter the master branch to your directory and remove empty commits
Rewrite 48dc599c80e2085ecbe6 (89/89)
Ref 'refs/heads/master' was rewritten
现在,仓库会包含指定子目录中的所有文件。虽然之前的所有文件都会被删除,但他们依旧存在于Git历史中。现在可以将新的本地仓库推送到远程了。10. 清理有时,Git会提示“untracked working tree files”会“overwritten by checkout”。造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生:$ git clean -f
# remove untracked files
$ git clean -fd
# remove untracked files/directories
$ git clean -nfd
# list all files/directories that would be removed
11. 将项目文件打成tar包,并且排除.git目录有时,你需要将项目副本提供给无法访问GitHub仓库的外部成员。最简单的方式就是使用tar或zip来打包所有的项目文件。不过,如果不小心,隐藏的.git目录就会包含到tar文件中,这会导致文件体积变大;同时,如果里面的文件与接收者自己的Git仓库弄混了,那就更加令人头疼了。轻松的做法则是自动从tar文件中排除掉.git目录:$ tar cJf .tar.xz / --exclude-vcs
12. 查找修改者最后,如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳:$ git blame
当然,Git命令是非常多的,除了上面介绍的12个重要命令外,相信各位InfoQ读者在日常工作过程中也有自己偏爱且好用的一些命令,不妨以评论的形式与其他读者一同分享。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1178762次
积分:14982
积分:14982
排名:第678名
原创:122篇
转载:14篇
译文:174篇
评论:1930条
(2)(1)(2)(9)(8)(8)(7)(5)(3)(1)(1)(13)(16)(16)(19)(1)(1)(1)(15)(29)(6)(9)(6)(33)(2)(6)(6)(1)(2)(1)(2)(8)(6)(4)(9)(2)(3)(4)(1)(2)(2)(12)(3)(5)(5)(3)(2)(1)(1)(1)(5)(2)(3)Git教程 - work hard work smart - 博客园
专注于Metro style app(C#),WPF,Asp.net。 不断总结,举一反三。
posts - 425, comments - 116, trackbacks - 0, articles - 0
首先分享一个很好学习Git的的网站
本教程通过命令行来阐述分布版本控制系统Git的使用。演示系统选取的是Linux(Ubuntu),但是在其他系统上也能功能,例如Windows系统。
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 0001-First-commit-in-the-branch.patch
# Switch to the master
git checkout master
# Apply the patch
git apply 0001-First-commit-in-the-branch.patch
# Do your normal commit in the master
git commit -a -m "Applied patch"
# Delete the patch
rm 0001-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版本中可以找到
19. Kindle版本教程
这个教程提供了Kindle版本
20. 问题与讨论
在提出问题之前,请先查看 . 如果你有任何的问题或者是从文章中找到错误,那么可以使用.& 我自己写了一个简短的列表 &可能会对你有用.
21.&链接和文章
Git on Windows
Git Cheat Sheets

我要回帖

更多关于 没有csproj文件 的文章

 

随机推荐