git命令总结

本文对比了Git和SVN的主要区别,强调Git的分布式特性与速度优势,并列举了Git常用命令,包括分支操作、代码提交、远程分支管理和错误处理。还介绍了创建新分支、回退远程分支、拉取并合并代码的步骤,以及解决冲突的流程。最后,讨论了处理Git错误`Renamefromxxx.lock'toxxxfailed`的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

注意:上述操作会将远程分支回退到指定的版本,但是会丢失从回退版本到当前版本之间的所有提交历史,需要谨慎操作。建议在本地进行回退操作,并在确保代码正确性后再推送到远程分支。

参考:git如何将远程的提交回退到指定的版本

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

  虽然报错,但好像不影响提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值