Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion
等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
我们在开始一个项目之前,首先要为这个项目创建一个版本仓库。
一、创建项目
首先我们要打开git页面https://github.com/,点击新建按钮,选择新建项目。
在新建项目页面填写项目名称(英文)和项目说明(非必填),点击新建项目,项目版本仓库就创建完成了。
二、远程项目与本地库关联
项目创建完成后,页面会自动跳转到项目仓库页面,这时项目还是一个空的项目版本仓库,我们需要将远程项目版本库与本地关联。
首先我们要设置一下全局用户名和邮箱
git config --global user.name “PYDaLuoSi”
git config --global user.email “daluosi@XXXX.com”
在这里,git官方给了三种不同的方式进行版本库的初始化。
1.创建新的版本库
$ echo "# exampleRepository" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin git@github.com:[你的git名称]/[项目名称(英文)].git
$ git push -u origin main
官方推荐的方法是先去创建一个README文件, 然后初始化仓库,将README文件加入存储列表, 然后对修改进行提交,这里有一句命令是git branch -M main,实际是将master分支进行重命名,git增加这项可能是为了消除黑人种族歧视。之后用git remote命令添加远程仓库地址,然后提交本次修改。
另一种比较常见的的创建方法如下
git clone git@github.com:[你的git名称]/[项目名称(英文)].git
cd [项目名称(英文)]
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
git clone 命令是git中克隆仓库的命令,回来当前目录下克隆远程仓库的内容,当前项目为空,所以会在当前目录生成一个以项目名称命名的空目录,如果设置显示隐藏文件夹,目录下实际上有一个**.git文件夹**,里面是git的相关信息,不要对这个文件夹下的文件进行任何操作。
cd 命令进入项目文件夹下,使用touch命令创建一个README.md文件,README.md文件是项目说明文件,远程git仓库会读取文件内容,显示在项目目录下方,方便访问者查看。
git add 命令是git中的添加命令,它会将文件加入到git的存储列表中,在提交和推送时,能够将已加入的文件上传到git仓库,这里使用git add README.md命令将README.md文件加入到存储列表中。
git commit命令是git中的提交命令,也是git中最常使用的命令,它会将项目的最新改动进行提交保存(只保存当前的改动,不上传git仓库)。这里使用*git commit -m “add README”*命令进行提交,-m参数是提交增加备注信息,这里备注的信息是add README。
git push 命令是git中的推送命令,它会将当前本地库中已提交的改动进行推送,上传到git版本库中。master是git中的分支名称,master是默认的主分支,origin是项目的源文件,可以理解为当前项目关联的git仓库地址,-u参数作用是本次提交后,再次使用git push命令时,不需要使用origin master命令就可以将代码推送到master分支。
2.关联已存在的文件夹
我们还是先看官方提供的方法。
git remote add origin git@github.com:LokieAnn/exampleRepository.git
git branch -M main
git push -u origin main
官方的方法中,上来直接添加远程仓库地址,然后重命名master分支,然后使用git push推送代码。(上述方法待实践,感觉省略了很多步骤,比如git add 和git commit等,也没有做初始化,所以我还是建议使用下面这种方法)
cd existing_folder
git init
git remote add origin git@git.corpautohome.com:antong/gitCommand.git
git add .
git commit -m "Initial commit"
git push -u origin master
关联已存在的文件夹,首先需要使用cd命令进入到已存在项目的文件夹中,在项目的根目录下进行后续操作。
git init命令是git中的初始化命令,它会在项目根目录下生成**.git文件夹**,未初始化的项目中,无法使用git命令进行其他操作。
git remote 命令是git中远程仓库操作命令,这里使用add方法将本地文件夹与远程仓库进行关联。
git add . 命令是讲当前项目目录下所有文件添加到git存储列表中,为之后推送项目做准备,特别注意,这个命令中有个英文符号点。
git commit 和 git push 与上面使用方法一致。
3.关联已存在的git版本库
官方这里提供的方法非常简略,直接点击Import code 按钮,然后在新页面中输入需要关联的远程仓库链接即可完成。
我在这里提供一个本地使用git命令对已有项目切换git仓库的方法。
cd existing_repo
git remote rename origin old-origin
git remote add origin git@git.corpautohome.com:antong/gitCommand.git
git push -u origin --all
git push -u origin --tags
首先需要进入已关联远程仓库的项目文件夹中,在项目的根目录下进行后续操作。PS. 这种方式使用场景比较少,仅供参考。
使用git remote rename 命令将已有源文件改名为old-origin。
然后使用上面讲过的git remote add命令关联新的版本库。
然后推送项目文件。–tags参数会将之前所有commit的历史信息推送。
使用上面三种方法的任意一种,都可以将本地库与远程仓库关联,关联后我们就可以进行版本管理了。
三、git的常用命令
1.git clone
git clone 命令是git中的克隆命令,将已有项目克隆到本地,一般在一个项目中,一个主程序员创建好项目的远程仓库后,其他成员只需要使用克隆命令将项目克隆到本地就可以进行开发工作了。
一般我们在使用中,不需要传入参数,只需要使用git clone 项目url [本地重命名] 来进行克隆即可,本地重命名可以不填。
2.git add
git add 命令是git中的添加命令,它会将新增的文件加入到git的存储列表中,在之后的提交和推送中,将文件的所有改动同步到git仓库。
git add 命令添加已存在存储列表的文件也不会报错,所以当新增文件比较多时,可以直接使用git add . 命令将所有文件添加到存储列表,当然,如果有一些本地调试的缓存数据,不想上传到git中时,可以进的单独的添加。
3.git commit
git commit 命令是git中的提交命令,它会将本地代码与远程仓库进行比较,对新修改的内容进行提交保存。
使用git commit命令时需要添加参数-m来给提交添加备注。
4.git push
git push 命令是git中的推送命令,它会将提交到暂存区的修改推送到远程git版本仓库中。
首次提交时使用git push -u origin master 命令后,之后的推送使用git push命令就可以将改动推送到master分支上。
如果需要推送其他分支,可以使用git push origin 分支名称 进行推送。
5.git status
git status 命令是git中的状态查询命令,它会比对当前代码和最后一次提交的代码是否发生改动。
使用 git status -s命令会返回简洁版的比对结果。
6.git pull
git pull 命令是git中的拉取命令,用于拉取代码的最新改动。
在首次克隆代码后,我们项目发生的改动不能通过再次克隆获取,所以要使用git pull进行拉取。
git pull拉取代码时会比对本地库代码,如果本地库代码发生过手动修改,则会出现代码冲突,具体的处理方法在下文代码合并中进行说明。
四、git的分支管理
git中的分支是将当前的主干使用快照分出一个新的分支,在分支中进开发不影响主干的代码。
举个例子,当我们在主干中配置了生产环境的运行配置后,开发新的功能需要调试时,就需要把配置修改为本地或测试环境,但是这种频繁的修改极容易出错,我们就可以从主干中创建一个分支,在分支中修改环境配置,然后在分支中运行调试。另一种场景就是多人协同开发时,如果同时在主干进行开发,彼此的修改会产生冲突和覆盖,我们可以分别创建自己的分支进行开发,之后将代码合并回去,能够减少冲突的产生。
1.git branch
git branch 命令是git中分支管理命令,用于查看当前分支列表和创建新分支。
在命令行输入git branch 命令,会显示当前本地库中的分支列表,其中以*号开头的分支为当前使用分支。
使用命令 git branch 分支名称 可以创建新的分支。
使用命令 git branch -d 分支名称 命令可以删除一个已有的分支。
2.git checkout
git checkout 命令是git中切换分支命令,用于切换本地分支。
在命令行输入git checkout 分支名称 命令,会切换到指定的分支中,分支中的代码独立维护,切换分支会使用该分支的快照替换当前代码。
使用命令 git checkout -b 分支名称 命令可以快速创建一个新的分支,并切换到该分支下。
3.git merge
git merge 命令是git中合并分支的命令,用于将本地其他分支合并到当前的分支中。
例如在master分支中输入 git merge test 命令,就是把test分支上的改动合并到master分支中。
五、代码合并
1.分支合并的操作
当我创建了本地分支,在开发完成需要进行合并时,首先要切换到主分支中。
然后使用git branch 命令获取当前的分支列表(防止手动输入时输入错误,能够根据分支列表对照着输入)。
输入 git merge 分支名称 命令,将待合并的分支合并到主分支中。
合并完成后使用 git branch -d 分支名称 命令将已经合并的分支删除掉。
功能开发为了规范化,每次合并后删除已经无用的分支,需要开发时再从主分支重新创建,保证分支代码能够跟主分支一致,减少冲突的产生。
2.分支合并冲突的解决
我们在开发中有时会遇到多人修改同一个文件的情况,这时进行分支合并,后提交的人会存在分支冲突。
当分支存在冲突时,使用 git merge 命令合并分支,会显示提示
Auto-merging 文件名称
CONFLICT (content): Merge conflict in 文件名称
Automatic merge failed; fix conflicts and then commit the result.
这段提示中对应的文件名称就是冲突文件,我们需要手动修改冲突文件,然后进行提交。
这时再打开文件,会发现产生冲突的代码位置已经有了特殊的标记。
<<<<<<< HEAD
代码 1
=======
代码 2
>>>>>>> 待合并分支名称
代码 1 是当前分支的代码,可能是其他人提交的代码,已经和拉取分支时不一致了。
代码 2 是我们开发的分支的代码,需要合并进来的。
我们需要手动去进行编写,这里的情况就比较多了。
例如两段代码并没有功能冲突(如我开发了一个功能A, 另一个人开发了功能 B,不过代码所在的位置产生了冲突),我们可以同时保留两段代码。
或者是两段代码是对同一个功能进行的修改,那就根据代码信息,判断需要保留哪一个代码,删除另外一条代码。
注意,修改时要将除代码以外的冲突标识全部删除。
修改完成后,保存当前的修改,再次回到git命令行。
在命令行执行git add 冲突文件名 命令重新添加文件到存储列表。
然后直接使用 git commit 命令(不需要-m和备注信息),完成合并提交。
[当前分支 提交编号] Merge branch '合并的分支’
看到上述提示,分支合并就完成了。
3.使用git pull 命令拉取代码时的冲突解决
当我们编写分支时,有其他人做了新的推送,我们想要拉取最新的代码,但是自身的开发已经无法退回到修改前的代码时,直接使用git pull会产生代码冲突,拉取操作失败。
error: Your local changes to the following files would be overwritten by merge:
[冲突文件名称]
Please commit your changes or stash them before you merge.
这时处于一个进退两难的情况,我们可以选择删除整个项目然后重新克隆,但是对应的自己开发的代码将全部失去,或者继续开发完成,然后提交代码,但这样可能会走很多弯路,产生代码冗余(比如别人推送的是一个公用方法,我们可以直接调用的)。
所以我们需要对代码冲突进行解决。
首先我们使用 git stash 命令进行暂存,git stash 命令是git中的暂存命令,可以将正在开发的代码暂存在本地的暂存区,暂存区根据存储时间倒序排列,对暂存内容进行编号,最新存储的内容为stash@{0},之后按照数字顺序向后排。
然后我们再使用git pull 命令拉取代码,这次拉取成功了,但是我们查看代码,发现我们的修改全都丢失了。
我们只需要使用命令 git stash pop stash@{0} 就可以将我们的修改从暂存区取出。
但取出的代码还是会存在冲突,我们需要进入到文件中手动处理冲突代码。
<<<<<<< Updated upstream
代码 1
=======
代码 2
>>>>>>> stashed changes
冲突代码的结构与merge冲突代码结构类似,代码1是拉取到的代码,代码2是我们自己修改的代码,然后选择需要保存的代码内容,同样删除所有冲突标识,然后保存文件。
使用命令 git add 冲突文件名称 将文件添加回存储列表。
最后我们使用 git stash drop stash@{0} 命令删除暂存区的存储。
4.使用git push 命令推送代码时的冲突解决
当我们编写完代码,使用git commit提交后,使用git push 推送代码产生了冲突,说明在这次编写过程中有其他人推送了代码,当前远程仓库中的代码和我们编辑之前已经不一致,不能直接覆盖了。
To [git仓库地址]
! [rejected] 当前分支 -> 仓库远程分支 (non-fast-forward)
error: failed to push some refs to 'git仓库地址'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
首先我们需要拉取远程分支代码来更新本地的标签,使本地标签与远程仓库一致。
Auto-merging 文件名称
CONFLICT (content): Merge conflict in 文件名称
然后我们进入到冲突文件中进行手动修改,冲突代码结构与前面一致,等号前的是远程仓库代码,等号后的是本地修改代码。
修改完成后保存文件,然后使用git add 命令添加文件到存储列表。
使用git commit 命令再次提交修改(需要添加 -m 备注),然后再次使用 git push 命令推送代码,推送冲突就解决了。