当前位置: 首页 > 科技观察

30分钟Git命令从入门到放弃

时间:2023-03-18 14:02:29 科技观察

【引自xjtuhit的博客】适合新手或熟悉图形工具的老手的教程。方便大家快速上手。Git现在极其流行,它广泛应用于大型开源项目、团队开发,以及独立开发者,甚至学生。初学者很容易被各种命令和参数吓到流泪。但实际上,您不需要了解所有命令的用途就可以开始使用。你可以从掌握一些简单而强大的命令开始,循序渐进地学习。(这就是本文的主题)。好吧,来吧!对git命令的基本理解是命令行工具的集合,可以用来跟踪和记录文件的变化。例如,您可以保存、比较、分析、合并等。这个过程称为版本控制。已经有一系列版本控制系统,如SVN、Mercurial、Perforce、CVS、Bitkeepe等。Git是分布式的,这意味着它不依赖于中央服务器,任何机器都可以拥有本地版本控制系统,我们称之为存储库。如果是多人协作,就需要一个在线仓库来同步信息。这就是GitHub、BitBucket所做的。1、安装Git安装git非常简单:Linux——打开控制台,然后通过包管理安装,Ubuntu上的命令是:sudoapt-getinstallgit-所有
Windows-建议使用gitforwindows,它包括图形工具和命令行模拟器。OSX-最简单的方法是使用自制软件进行安装,如果您首先使用图形工具,则从命令行执行brewinstallgit
,那么推荐大家使用Github桌面,Sourcetree。但是我还是推荐大家使用命令行,下面的内容都是命令行。2.配置Git安装完git之后,第一个任务就是配置我们的信息,最重要的就是用户名和邮箱地址。打开终端并执行以下命令。$gitconfig--globaluser.name"MyName"
$gitconfig--globaluser.emailmyEmail@example.com
配置为这两个,用户可以看到谁做了什么,一切都更有条理,对吧?3.创建一个新的仓库——gitinitgit会保存你项目中的所有文件和历史,创建一个新的仓库,首先到项目路径下执行gitinit。然后git会创建一个隐藏文件夹.git存储所有信息。在桌面创建联系人文件夹git_exercise,打开终端:$cdDesktop/git_exercise/
$gitinit
OK,现在项目还没有,试试新建一个hello.txt文件~4.查看状态——gitstatusgitstatus是另外一个很重要的命令,它会告诉我们库当前的状态:是否是最新的代码,更新了什么等。执行gitstatus:$gitstatus

Onbranchmaster

Initialcommit

Untrackedfiles:
(use"gitadd..."toincludeinwhatwillbecommitted)

hello.txt
git告诉我们hello.txt没有被跟踪,这是因为这个文件是新的,git不知道它应该被跟踪更改,或者干脆忽略它。为了跟踪我们的新文件,我们需要暂存它。5.暂存区——gitaddgit有一个概念叫做暂存区,你可以把它想象成一张空白的画布,包裹着你可能提交的所有更改。它一开始是空的,您可以使用gitadd命令添加内容,然后使用gitcommit提交。本例中只有一个文件:$gitaddhello.txt
如果需要提交目录下的所有内容,你可以这样做:$gitadd-A
再用gitstatus查看:$gitstatus

Onbranchmaster

Initialcommit

要提交的更改:
(使用“gitrm--cached...”tounstage)

newfile:hello.txt
我们的文件已经提交。状态信息也会告诉我们暂存区文件发生了什么变化,但这里我们提交的是一个全新的文件。6.提交——gitcommit一次提交代表我们的仓库已经到了交付状态,通常是一个小功能已经完成。它就像一张快照,可以让我们像使用时光机一样回到过去。要创建一个提交,我们需要提交一些东西到暂存区(gitadd),然后:$gitcommit-m"Initialcommit."
这会创建一个提交,-m“初始提交”。表示对本次commit的描述,建议使用有意义的描述信息。远程存储库到目前为止,我们的操作都是本地的,它存在于.git文件中。为了能够协同开发,我们需要将代码发布到远程仓库。1.链接远程仓库——gitremoteadd为了能够上传到远程仓库,我们需要先建立一个链接。本教程中,远程仓库地址为:https://github.com/tutorialzine/awesome-project,但你应该在Github、BitBucket上搭建自己的仓库,一步步尝试。添加远程仓库用于测试$gitremoteaddoriginhttps://github.com/tutorialzine/awesome-project.git
一个项目可以到同时拥有多个远程仓库,为了能够区分它们,它们通常有不同的名称。通常主要的远程存储库称为origin。2、上传到服务器——gitpush每次我们要向服务器提交代码,都会用到gitpush。gitpush命令会有两个参数,远程仓库的名字,和分支的名字:$gitpushoriginmaster

Countingobjects:3,完成。
写入对象:100%(3/3),212bytes|0bytes/s,完成。
Total3(delta0),reused0(delta0)

*[newbranch]master->master
根据您使用的服务器,您可能需要在推送过程中验证您的身份。如果没有问题,现在使用浏览器转到您的远程分支,hello.txt已经在那里等着您了。3.克隆仓库——gitclone是一个放在Github上的开源项目,人们可以看到你的代码。可以使用gitclone下载到本地。$gitclonehttps://github.com/tutorialzine/awesome-project.git
也会在本地新建一个仓库,并自动将github上的分支设置为远程分支。4、从服务器拉取代码——gitpull如果你更新代码到仓库,其他人可以通过gitpull命令拉取你的更改:$gitpulloriginmaster
From
*branchmaster->FETCH_HEAD
Alreadyup-to-date.
因为还没有其他人提交,所以当你在处理一个新特性的时候没有变更分支Sometimes,最好在单独的区域开发,通常称为分支。分支相互独立,有自己的历史。这样做的原因是:稳定版的代码不会被破坏,不同的开发者可以同时开发不同的功能。开发者可以专注于自己的分支而不用担心被别人破坏。不确定之前,同一个功能可以有多个版本,方便比较。1.新建一个分支——gitbranch每个仓库的默认分支叫做master,新建一个分支是这样的:$gitbranchamazing_new_feature
新建一个分支,名称为amazing_new_feature,与当前分支起点相同2.切换分支——gitcheckout单独使用gitbranch查看分支状态:$gitbranch
amazing_new_feature
*master
*表示当前活跃分支为master,使用gitcheckout切换分支。$gitcheckoutamazing_new_feature
3.合并分支-gitmergeouramazing_new_feature分支的任务是添加一个featuer.txt。让我们创建,添加到暂存,提交。$gitaddfeature.txt
$gitcommit-m"Newfeaturecomplete."
新分支任务完成,返回masterbranch$gitcheckoutmaster
现在查看文件,会发现之前创建的feature.txt文件没有了,因为有没有feature.txt。使用gitmerge将amazing_new_feature分支合并到master中。$gitmergeamazing_new_feature
好的!然后删除amazing_new_feature分支。$gitbranch-damazing_new_feature
高级在本文的最后一节中,我们将讨论一些更高级和常用的技术。1.比较两个不同提交的区别。每个提交都有一个唯一的ID。要查看所有提交及其ID,您可以使用gitlog:$gitlog

commitba25c0ff30e1b2f0259157b42b9f8f5d174d80d7
Author:Tutorialzine
Date:MonMay3017:15:282016+0300

Newfeaturecomplete

commitb10cc1238e355c02a044ef9f9860811ff605c9b4
Author:Tutorialzine
Date:MonMay3016:30:042016+0300

Addedcontenttohello.txt

commit09bd8cc171d7084e78e4d118a2346b7487dca059
作者:Tutorialzine
Date:SatMay2817:52:032016

初始提交
br>id很长,但你不需要复制整个字符串,前一小部分就足够了。要查看特定提交中更新的内容,请使用gitshow:$gitshowb10cc123
commitb10cc1238e355c02a044ef9f9860811ff605c9b4
作者:Tutorialzine
日期:MonMay3016:30:042016+0300

添加了contenttohello.txt

diff--gita/hello.txtb/hello.txt
indexe69de29..b546a21100644
---a/hello.txt
>+++b/hello.txt
@@-0,0+1@@
+Niceweathertoday,不是吗?
检查两个提交之间的区别,你可以使用gitdiff[commit-from]..[commit-to]语法:$gitdiff09bd8cc..ba25c0ff

diff--gita/feature.txtb/feature.txt
newfilemode100644
index0000000..e69de29
diff--gita/hello.txtb/hello.txt
index69de29..b546a21100644
---a/hello.txt
>+++b/hello.txt
@@-0,0+1@@
+今天天气不错,不是吗?
比较第一个和最后提交,我们可以看到所有更改。当然,使用gitdifftool命令更方便。2.将文件回滚到以前的版本git允许我们将特定文件回滚到特定提交,也可以使用gitcheckout。在下面的示例中,我们将hello.txt回滚到其原始状态,我们需要指定回滚到哪个提交以及文件的完整路径。$gitcheckout09bd8cc1hello.txt
3.回滚提交如果发现最新的提交已经添加完一个文件,可以通过gitcommit--amend修复,它会将最新的提交放回暂存区,并尝试重新提交。如果是比较复杂的情况,比如不是最新提交。然后你可以使用gitrevert。最新的提交别名也称为HEAD。$gitrevertHEAD
其他提交可以使用id:$gitrevertb10cc123
滚动提交时冲突非常频繁。当文件被后来的提交修改时,git无法正确回滚。4.解决合并冲突冲突经常出现在合并分支或者拉取别人的代码中。有时git可以自动处理冲突,但大多数需要手动处理。例如,John和Tim在各自的分支上编写了两部分代码。Johnlikesfor://Useaforlooptoconsole.logcontents.
for(vari=0;i控制台。log(arr[i]);

Tim喜欢forEach://UseforEachtoconsole.logcontents.
arr.forEach(function(item){
console.log(item);
});
假设John现在要提取Tim的代码:$gitmergetim_branch

Auto-mergingprint_array.js
CONFLICT(content):Mergeconflictinprint_array.js
Automaticmergefailed;fixconflictsandthencommittheresult.
此时git不确定如何解决冲突,因为他不知道约翰或蒂姆谁写得更好。所以它在代码中插入标记。<<<<<<//使用forlooptoconsole.logcontents.
for(vari=0;iconsole.log(arr[i]);

=======
//UseforEachtoconsole.logcontents.
arr.forEach(function(item){
console.log(item);
});
>>>>>>Timscommit.
====上面的数字是最新的提交,下面的是冲突代码。我们需要解决此类冲突。经过组委会成员的讨论,一致决定在座的都是垃圾!两个都不想要。将其更改为下面的代码。//NousingforlooporforEach.
//UseArray.toString()to
console.logcontents.console.log(arr.toString());
好了,再次提交:$gitadd-A
$gitcommit-m"Arrayprintingconflictresolved."
如果在大型项目中,此过程可能容易出现问题。您可以使用GUI工具来帮助您。使用git合并工具。5.配置.gitignore大多数项目中,都会有写好的文件和文件夹,我们不想提交。为了防止意外提交,我们需要一个gitignore文件:在项目的根目录下创建一个.gitignore文件,在文件中列出不需要提交的文件名和文件夹名,.gitignore的每一行文件需要提交,和普通文件一样通常被忽略的文件有:日志文件taskrunner构建node_modules等文件夹IDE生成的文件个人笔记如:*.log
build/
node_modules/
.idea/
my_notes.txt