文章目录
一、Git 与 SVN 最主要区别
SVN 是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git 是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
缺点:
- 模式上比SVN更加复杂。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
官网: https://git-scm.com/
源码: https://github.com/git/git/
二、Git 命令总结
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程的所有分支
git branch <branchname> //新建分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git branch -m <oldbranch> <newbranch> //重命名本地分支
git checkout master //选择or切换到master分支
git merge dev //将dev分支合并到当前分支(master)中
git checkout -b zhanghanlun origin/zhanghanlun //切换到 origin/zhanghanlun 分支命令,本地分支为”zhanghanlun”
参考:
https://www.cnblogs.com/best/p/7474442.html
git的安装与配置教程-超详细版
Gitlab设置ssh密钥详解
三、扩展
1. 新建分支后第一次上传代码
在 gitlab 上创建新分支 xiaoqiang 后将你的代码上传上去:
cd existing_repo
git remote add origin http://192.168.250.250:9000/server/xxx.git
git push -uf origin xiaoqiang
在 idea 中提交代码后将本地分支推送到远程仓库:
git push origin localbranchname:remotebranchname
方式二:
注:先在 GitLab 上创建分支,然后 Clone 到你本地(默认是 Master 分支),再把你写好的项目中的 src 目录和 pom.xml 文件粘贴过来就行。
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (master)
$ git checkout feature-xiaoqiang
Switched to a new branch 'feature-xiaoqiang'
branch 'feature-xiaoqiang' set up to track 'origin/feature-xiaoqiang'.
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (feature-xiaoqiang)
$ git add .
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (feature-xiaoqiang)
$ git commit -m 'xiaoqiang init'
[feature-xiaoqiang 702bd93] xiaoqiang init
32 files changed, 5789 insertions(+)
create mode 100644 pom.xml
......
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (feature-xiaoqiang)
$ git push
Enumerating objects: 47, done.
Counting objects: 100% (47/47), done.
Delta compression using up to 16 threads
Compressing objects: 100% (40/40), done.
Writing objects: 100% (46/46), 50.90 KiB | 2.12 MiB/s, done.
Total 46 (delta 9), reused 0 (delta 0), pack-reused 0
remote:
......
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (feature-xiaoqiang)
$ git checkout develop
Switched to a new branch 'develop'
branch 'develop' set up to track 'origin/develop'.
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (develop)
$ git merge feature-xiaoqiang
Updating 7a57766..702bd93
Fast-forward
pom.xml | 246 ++++++++++
......
xiaoqiang@xiaoqiang MINGW64 /d/a_linshi/heheda (develop)
$ git push
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
......
2. 将远程分支回退:
# 首先,需要使用git log命令查看远程分支的提交历史,确定需要回退到哪个版本,记录下该版本的commit hash。
git log origin/branch_name
# 然后,使用git reset命令将远程分支回退到指定的版本。其中,--hard选项可以强制更新本地代码,慎用。
git reset commit_hash 或者 git reset --hard commit_hash
# 最后,使用git push强制推送修改到远程分支。需要注意的是,强制推送会覆盖远程分支的代码,可能会引起代码冲突。
git push -f origin branch_name
注意:上述操作会将远程分支回退到指定的版本,但是会丢失从回退版本到当前版本之间的所有提交历史,需要谨慎操作。建议在本地进行回退操作,并在确保代码正确性后再推送到远程分支。
3. 将远程主机的最新内容拉下来后直接合并
将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略:git pull origin next
。
git pull
是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
git pull --verbose //--verbose选项会显示下载内容以及合并过程的详细信息。
# git pull 的过程可以理解为:
git fetch origin master //从远程主机的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
# git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git fetch //是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
git fetch <远程主机名> <分支名> //如果只想取回特定分支的更新,可以指定分支名。注意之间有空格
# 取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:git log -p FETCH_HEAD
记一次实操:
# 查看当前的分支
$ git branch
* feature-xiaoqiang
$ git merge origin/dev
error: Your local changes to the following files would be overwritten by merge:
src/main/java/com/heheda/app/App.java
Please commit your changes or stash them before you merge.
Aborting
Merge with strategy ort failed.
$ git status
On branch feature-xiaoqiang
Your branch is up to date with 'origin/feature-xiaoqiang'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
src/main/java/com/heheda/app/App.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
src/main/scala/
target/
no changes added to commit (use "git add" and/or "git commit -a")
# 将你未完成未提交的代码放在缓存里
$ git stash
Saved working directory and index state WIP on feature-xiaoqiang: b51a1d7 点个赞关注一下呗
# 获取缓存列表
$ git stash list
stash@{0}: WIP on feature-xiaoqiang: b51a1d7 点个赞关注一下呗
# 将远程的 dev 分支合并到当前分支
$ git merge origin/dev
Merge made by the 'ort' strategy.
.../com/heheda/app/App.java | 8 +-
.../com/heheda/app/HeheApp.java | 120 +++++++++++++++++++++
...line_task_scheduling.py => offonline_task_opt.py} | 0
10 files changed, 399 insertions(+), 54 deletions(-)
create mode 100644 src/main/java/com/heheda/app/HeheApp.java
rename src/main/java/com/heheda/script/{offline_task_scheduling.py
=> offonline_task_opt.py} (100%)
# 将本地最新的修改推送到远程对应的分支上
$ git push origin feature-xiaoqiang:feature-xiaoqiang
Enumerating objects: 25, done.
Counting objects: 100% (25/25), done.
Delta compression using up to 16 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 907 bytes | 907.00 KiB/s, done.
Total 9 (delta 2), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for feature-xiaoqiang, visit:
remote: http://192.168.250.250:9000/server/offlinedata/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature-xiaoqiang
remote:
To http://192.168.250.250:9000/server/xxx.git
b51b1d7..b5b990c feature-xiaoqiang-> feature-xiaoqiang
# 重新运用缓存区的内容
$ git stash apply
Auto-merging src/main/java/com/heheda/app/App.java
CONFLICT (content): Merge conflict in src/main/java/com/heheda/app/App.java
On branch feature-xiaoqiang
Your branch is up to date with 'origin/feature-xiaoqiang'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/main/java/com/heheda/database/JDBCConnPool.java
modified: src/main/java/com/heheda/utils/HBaseUtil.java
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: src/main/java/com/heheda/app/App.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
hehedata.iml
src/main/scala/
target/
# 最后去 Idea 里解决冲突即完美解决
4. 查看关于某个特定远程的额外信息
要查看关于某个特定远程的额外信息,请使用 git remote
命令和 show 子命令。它的使用方法是:语法:git remote show <remote>
。它将产生关于远程服务器的信息。它包含一个与远程相关的分支的列表,以及为获取和推送所连接的端点。
参考:Git – Pull命令
四、报错总结
报错1:Rename from xxx.lock’ to xxx failed
$ git push origin xiaoqiang:xiaoqiang
Rename from 'D:/WorkSpace/Idea/heheda-20231219/.git/refs/remotes/origin/xiaoqiang.lock' to 'D:/WorkSpace/Idea/heheda-20231219/.git/refs/remotes/origin/xiaoqiang' failed.
Should I try again? (y/n) n
error: update_ref failed for ref 'refs/remotes/origin/xiaoqiang': couldn't set 'refs/remotes/origin/xiaoqiang'
Everything up-to-date
虽然报错,但好像不影响提交。