1.什么是Git?
Git是一种流行的文件版本控制系统,在全球范围内被众多开发人员用于其项目。 与同类产品相比,它重量轻且性能Swift。 借助许多基于UI的工具来协助基于Git的版本控制,开发人员使用Git版本控制系统变得极为方便。 Git标榜了便宜的本地分支,方便的暂存区域和多种工作流配置等功能。
在本文中,我们将特别关注使用Git的入门,并介绍一些简单项目所需的一些基本命令。 本文涵盖了版本控制期间可能出现的所有可能情况。 但是,在开始之前,有必要在系统上安装Git版本控制系统(VCS)。
2. Git安装
要将Git安装到您的系统中,请遵循以下步骤:
2.1在Windows和MacOS中安装Git
- 转到Git VCS主页
- 您应该能够找到可用的最新Git版本的下载按钮
- 下载并安装相同的
为了验证安装,请在命令提示符(Windows)或终端(Mac OS)中输入以下命令。
$ git --version
如果安装正常,将出现如下所示的输出。
2.2在Linux中安装Git Core
Git没有为Linux提供准备安装的安装文件。 因此,有另一种方法来安装它。 从终端执行以下命令以安装git-core软件包。
$ sudo apt-get install git-core
这将执行所有必要步骤,一旦准备就绪,请按照以下步骤来验证安装。
在“终端”窗口中输入以下命令。
$ git --version
如果安装正常,将出现如上所示的输出。
3.从Git版本开始
一旦完成安装和验证,就可以开始使用Git进行第一个项目版本控制了。 我们将在这里使用虚拟Java项目来更好地了解项目的文件版本控制。 您可以使用任何流行的IDE来创建Java项目并开始使用。 这里使用的IDE是Eclipse IDE。 但是,对于命令的执行,我们将严格限制于命令行工具。
3.1创建和初始化Git存储库
为了将项目配置为使用基于Git的版本控制系统,您要做的就是将项目目录初始化为GIT存储库。 使用首选的IDE在所需的目录中创建Java项目。
现在,打开您的终端,并使用流行的cd
命令将目录更改为项目目录。
$ cd /path/to/project
要初始化Git存储库,执行命令git init
。 如下所示的输出应该是可见的。
$ git init
Initialized empty Git repository in /Users/abhishekkothari/Desktop/JavaCodeGeeks/GitBeginners/GitBeginner/.git/
可以看出,在项目文件夹中创建了一个.git目录。 此文件夹跟踪本地发生的所有更改。 您可以使用命令git status
来检查目录git status
。 它应提供类似于以下所示的输出。 如果您使用其他IDE,则可能会有所不同。
$ git status
On branch master
No commits yet
Untracked files:
(use "git add ..." to include in what will be committed)
.classpath
.project
.settings/
bin/
src/
3.2从文件版本控制开始
现在,在项目中,创建一个Java文件,如下所示。
SayHello.java
package com.javacodegeeks;
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello there!");
}
}
IDE可能会显示软件包错误。 如果不需要,请随时删除包装声明。 创建文件后,我们需要将文件添加到GIT索引中。 这将确定此后跟踪文件的更改。 要将文件添加到索引,请执行命令git add /path-to-file/SayHello.java
。 该命令将没有反馈。 但是,您可以检查状态以确定文件已添加到索引中。
检查状态时,将显示类似于以下所示的输出。
$ git add src/com/javacodegeeks/SayHello.java
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: src/com/javacodegeeks/SayHello.java
Untracked files:
(use "git add ..." to include in what will be committed)
.classpath
.project
.settings/
bin/
该流程的下一步是将文件实际提交到存储库。 提交文件意味着存储库中文件的当前版本将被覆盖。 可以使用命令git commit
。 也可以添加描述正在提交的更改的注释。 为此,请执行如下所示的命令。
$ git commit -m "First File Committed"
这将提交在跟踪中提及注释“ First File Committed ”的文件 。 类似于以下所示的输出应该是可见的。
$ git commit -m "First File Committed"
[master (root-commit) 9cce524] First File Committed
1 file changed, 7 insertions(+)
create mode 100644 src/com/javacodegeeks/SayHello.java
3.3处理多个文件
当有多个文件要使用时,通常使用文件版本控制。 因此,当然需要有一种方法可以轻松地处理多个文件,而不是为每次要索引的每个文件执行git add file-name
。 为了理解它们,让我们再创建两个简单的Java文件,如下所示。
EvenNumbers.java
package com.javacodegeeks;
public class EvenNumbers {
public static void printEvenNumber(int i) {
System.out.println("Even numbers upto "+i);
for(int x=0;x<i;x=x+2)
System.out.println(x);
}
}
OddNumbers.java
package com.javacodegeeks;
public class OddNumbers {
public static void printOddNumber(int i) {
System.out.println("Odd numbers upto "+i);
for(int x=1;x<i;x=x+2)
System.out.println(x);
}
}
现在,我们需要将这两个文件添加到索引中,而无需为每个文件执行命令。 为此,有两种方法。 当您特别希望添加具有特定扩展名的文件时,其中之一非常有用。 例如,
$ git add *.java
上面的命令会将所有扩展名为.java的文件添加到暂存中。 暂存是保存文件版本直至提交的区域。 另一种可能的方法是使用以下命令添加项目中存在的所有文件。
$ git add -A
此命令将处理所有文件-新建,修改和删除。 现在,如下所示修改文件SayHello.java
。
SayHello.java
package com.javacodegeeks;
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello there!");
EvenNumbers.printEvenNumber(11);
OddNumbers.printOddNumber(12);
}
}
现在执行以上命令之一,将所有Java文件添加到登台区域,然后检查状态。 状态应类似于以下所示:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: src/com/javacodegeeks/EvenNumbers.java
new file: src/com/javacodegeeks/OddNumbers.java
modified: src/com/javacodegeeks/SayHello.java
Untracked files:
(use "git add ..." to include in what will be committed)
.classpath
.project
.settings/
bin/
如果您使用命令git add -A
,它也会将所有空目录也添加到索引中。 如果这与预期不符,则可以通过执行git reset
轻松撤消舞台上的移动。 它将重置已执行的添加操作,并将登台恢复为先前的提交。 将提供类似于以下所示的输出。
$ git reset
Unstaged changes after reset:
M src/com/javacodegeeks/SayHello.java
重置后,您可以将所需的文件添加到暂存中,并在一切正常后提交。
3.4连接到远程存储库
在上述步骤中跟踪和存储的更改均在本地跟踪。 目前,这些文件不在线供其他开发人员使用。 为了使其他开发人员能够访问或克隆代码,将本地代码库连接到远程存储库很重要。 为此,您需要首先在流行的Git托管平台(例如GitHub)上创建在线存储库。 对于本文,我在Github上创建了一个存储库GitBeginner 。 要将本地文件连接到存储库,请执行以下命令。
$ git remote add origin https://github.com/datsabk/GitBeginner.git
该命令将没有反馈。 但是,您可以使用以下命令检查连接是否成功。
$ git remote show origin
* remote origin
Fetch URL: https://github.com/datsabk/GitBeginner.git
Push URL: https://github.com/datsabk/GitBeginner.git
HEAD branch: (unknown)
现在,本地文件已连接到远程存储库,是时候将文件推送到存储库了。 为此,请执行以下命令:
$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 471 bytes | 157.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/datsabk/GitBeginner.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
如果您没有为用户详细信息配置Git,则会提示您输入相应主机帐户的凭据。 您可以按照以下链接中的步骤配置Git用户名和密码。
3.5 Git分支和合并
在大型项目中,开发人员通常不在公共分支上工作。 每个开发人员都针对他们正在开发的功能或他们要解决的错误创建一个分支。 本节介绍创建分支并将其合并到主分支中的过程。
首先,让我们创建一个本地分支。 为了创建一个新的本地分支,执行命令git checkout -b newbranch
。 这将创建一个新的本地分支并切换到该分支。 将提供类似于以下所示的输出。
$ git checkout -b newbranch
M src/com/javacodegeeks/SayHello.java
Switched to a new branch 'newbranch'
现在,让我们在SayHello.java
更改一些代码,如下所示:
SayHello.java
package com.javacodegeeks;
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello there!");
System.out.println("Printing even numbers");
EvenNumbers.printEvenNumber(11);
System.out.println("Printing odd numbers");
OddNumbers.printOddNumber(12);
}
}
开发人员有时需要检查远程存储库中文件之间的差异。 只要需要,只需执行命令git diff
来检查所有修改。 类似于以下所示的输出将打开。
$ git diff
diff --git a/bin/com/javacodegeeks/SayHello.class b/bin/com/javacodegeeks/SayHello.class
index 0e9d8e3..6c45444 100644
Binary files a/bin/com/javacodegeeks/SayHello.class and b/bin/com/javacodegeeks/SayHello.class differ
diff --git a/src/com/javacodegeeks/SayHello.java b/src/com/javacodegeeks/SayHello.java
index 815b53a..4276f44 100644
--- a/src/com/javacodegeeks/SayHello.java
+++ b/src/com/javacodegeeks/SayHello.java
@@ -3,7 +3,9 @@ package com.javacodegeeks;
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello there!");
+ System.out.println("Printing Even numbers");
EvenNumbers.printEvenNumber(11);
+ System.out.println("Printing Odd numbers");
OddNumbers.printOddNumber(12);
}
}
可以注意到,有+号表示添加了两行。 对于.class文件,Git无法将它们作为文本读取,因为它们是二进制字节码。 因此,它只是说它们与先前的承诺不同。 现在,该推送这些更改并将其合并到master分支了。 将更改推送到远程存储库的过程保持不变。 执行如下命令:
$ git commit -m "Added two lines"
[newbranch 3f7d0cb] Added two lines
1 file changed, 2 insertions(+)
MacBook-Air:GitBeginner abhishekkothari$ git push -u origin newbranch
Counting objects: 24, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (24/24), 3.09 KiB | 791.00 KiB/s, done.
Total 24 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/datsabk/GitBeginner.git
* [new branch] newbranch -> newbranch
Branch 'newbranch' set up to track remote branch 'newbranch' from 'origin'.
现在,已在远程存储库上创建了新分支,并将更改推送到该分支。 但是,更改在master分支中尚不可用。 为了将这些更改拉入master分支,请使用Github UI提出合并请求,如下所示。
提出合并请求后,授权人员可以接受该请求并将更改拉到主存储库中并使其对其他人可用。 在大型项目中,合并期间经常会发生冲突。 当其他开发人员已经将更改合并到您要合并的文件中时,就会发生冲突。 在这种情况下,Git无法确定更改是应覆盖还是合并。
通过在master分支中编辑SayHello.java文件,在上述pull请求中生成了一个冲突的场景,如下所示:
SayHello.java
package com.javacodegeeks;
public class SayHello {
public static void main(String[] args) {
System.out.println("Hi there!");
}
}
完成此更改后,拉取请求将显示冲突,如下所示:
通过单击“解决冲突”并选择合并后需要写入文件的代码,可以以交互方式解决这些冲突。 这样的冲突有时可能具有挑战性。 因此,建议以增量方式对文件进行最新更改,以避免大量冲突代码。 可以使用以下命令来提取任何特定分支的最新更改:
$ git fetch origin
$ git merge origin/master
第一个命令将提取各个分支的最新更改。 下一条命令完成将获取的更改合并到本地文件中的工作。
3.6忽略某些文件
在之前的操作中,我们坚持使用git add *.java
命令。 但是,并非总是如此。 在某些情况下,我们可能希望仅忽略某些文件而不是全部文件。 在这种情况下,以下命令会派上用场。
$ git rm -r --cached *.class
执行上面的命令然后检查存储库的状态时,您会发现类文件现在已被忽略,并且git status
的输出类似于以下所示。
$ git status
On branch newbranch
Your branch is up to date with 'origin/newbranch'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
deleted: bin/com/javacodegeeks/EvenNumbers.class
deleted: bin/com/javacodegeeks/OddNumbers.class
deleted: bin/com/javacodegeeks/SayHello.class
Untracked files:
(use "git add ..." to include in what will be committed)
bin/
它指示从跟踪列表中删除了类文件,并且现在未跟踪bin文件夹。 因此,文件现在位于忽略列表中。 可以在项目目录中的.gitignore文件中找到此列表。
4。结论
本文以初学者的方式深入介绍了为项目创建和管理Git存储库的完整过程。 它捕获了开发人员可能遇到的基本问题或功能。 未来将面临复杂的挑战。 但是,由于Git是流行的版本控制系统,因此应该有足够的帮助。
5.参考
翻译自: https://www.javacodegeeks.com/2018/03/git-tutorial-for-beginners.html