Git本地仓库和远程仓库操作和分支操作

举报
共饮一杯无 发表于 2022/09/03 12:33:34 2022/09/03
【摘要】 本地仓库操作 git status 查看文件状态也可以使用git status –s 使输出信息更加简洁 git add 将未跟踪的文件加入暂存区添加一个或多个文件到暂存区:git add [file1][file2]...添加指定目录到暂存区,包括子目录:git add [dir]添加当前目录下的所有文件到暂存区:git add .将新创建的文件加入暂存区后查看文件状态 git rese...

本地仓库操作

git status 查看文件状态

image.png
也可以使用git status –s 使输出信息更加简洁
image.png

git add 将未跟踪的文件加入暂存区

添加一个或多个文件到暂存区:

git add [file1][file2]...

添加指定目录到暂存区,包括子目录:

git add [dir]

添加当前目录下的所有文件到暂存区:

git add .

image.png
将新创建的文件加入暂存区后查看文件状态
image.png

git reset 将暂存区的文件取消暂存

image.png
将文件取消暂存后查看文件状态
image.png

git commit 将暂存区的文件修改提交到本地仓库

用命令git commit告诉 Git,把文件提交到仓库 ,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

  • 1 file changed:1个文件被改动(我们新添加的helloWorld.txt文件)
  • 0 insertions:没有新增内容变化。
  • 0 deletions:没有删除内容变化。

image.png

git rm 删除文件

image.png
删除文件后查看文件状态
image.png
上面删除的只是工作区的文件,需要提交到本地仓库
image.png
将文件添加至忽略列表

.gitignore 配置忽略提交

一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:

# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

我日常SpringBoot项目配置如下:

*.iml
.idea/
**/target/
*/src/main/webapp/
logs
*.class

git log 查看日志记录

git log命令显示从最近的提交日志, 如果嫌输出信息太多,可以试试加上--pretty=oneline参数。
image.png

git fetch 强制拉取

git fetch --all

git reset --hard origin/branch-name

git pull

git revert 本地回滚然后提交

指定回退某个提交

git revert -n <commitId>

你回退到了某个版本,然后后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
Git 提供了一个命令git reflog用来记录你的每一次命令,当你用git reset --hard HEAD^回退到wrote a readme file版本时,再想恢复到add distributed,就可以通过git reflog命令找到add distributed的commit id。
git 中关于撤销以及删除文件的不同场景

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以用命令git reset --hard commit_id,不过前提是没有推送到远程库

远程仓库操作

前面执行的命令操作都是针对的本地仓库,接下来我们学习关于远程仓库的一些操作,具体包括:

git remote 查看远程仓库

如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字

$ git remote
origin

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote -v
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (push)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote show origin
* remote origin
  Fetch URL: https://gitee.com/helloMrZhan/gitCreateTest.git
  Push  URL: https://gitee.com/helloMrZhan/gitCreateTest.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

git remote add 添加远程仓库

运行 git remote add   <shortname><url>添加一个新的远程 Git 仓库,同时指定一个可以引用的简写

$ git remote add origin2 https://gitee.com/helloMrZhan/gitCreateTest.git

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote -v
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (push)
origin2 https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin2 https://gitee.com/helloMrZhan/gitCreateTest.git (push)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

git clone 从远程仓库克隆

如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

克隆仓库的命令格式是 git clone [url]

$ git clone https://gitee.com/helloMrZhan/gitCreateTest.git
Cloning into 'gitCreateTest'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e

git remote rm 移除无效的远程仓库

如果因为一些原因想要移除一个远程仓库 ,可以使用 git remote rm

$ git remote add origin2 https://gitee.com/helloMrZhan/gitCreateTest.git

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote -v
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (push)
origin2 https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin2 https://gitee.com/helloMrZhan/gitCreateTest.git (push)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote rm origin2

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git remote -v
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (fetch)
origin  https://gitee.com/helloMrZhan/gitCreateTest.git (push)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库

git fetch 从远程仓库中抓取与拉取

git fetch 是从远程仓库获取最新版本到本地仓库,不会自动merge

$ git fetch origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://gitee.com/helloMrZhan/gitCreateTest
 * branch            master     -> FETCH_HEAD
   55acabe..509598c  master     -> origin/master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

git pull 是从远程仓库获取最新版本并merge到本地仓库

修改远程仓库的文件,然后git pull

$ git pull origin master
From https://gitee.com/helloMrZhan/gitCreateTest
 * branch            master     -> FETCH_HEAD
Updating 55acabe..509598c
Fast-forward
 README.md | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数–allow-unrelated-histories

git push 推送到远程仓库

当你想分享你的代码时,可以将其推送到远程仓库。 命令形式:git push [remote-name] [branch-name]

$ git add .

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git commit -m "add hello.txt" hello.txt
[master 0b2584f] add hello.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 255 bytes | 127.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/helloMrZhan/gitCreateTest.git
   509598c..0b2584f  master -> master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

Git分支

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git 的master分支并不是一个特殊分支。 它跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。

git branch 查看分支

# 列出所有本地分支

$ git branch

# 列出所有远程分支

$ git branch -r

# 列出所有本地分支和远程分支

$ git branch -a
$ git branch
* master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git branch -r
  origin/master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git branch -a
* master
  remotes/origin/master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

git branch [branch name] 创建分支

$ git branch dev

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git branch
  dev
* master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)

git checkout 切换分支

  • 下载远程分支为本地分支: git checkout -b <localName> <branch-name>

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

git branch dev
git checkout dev

$ git checkout dev
Switched to branch 'dev'

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (dev)
$ git branch
* dev
  master

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (dev)

git push 推送至远程仓库分支

$ git push origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
remote: Create a pull request for 'dev' on Gitee by visiting:
remote:     https://gitee.com/helloMrZhan/gitCreateTest/pull/new/helloMrZhan:dev...helloMrZhan:master
To https://gitee.com/helloMrZhan/gitCreateTest.git
 * [new branch]      dev -> dev

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (dev)

image.png

git merge 合并分支

git merge命令用于合并指定分支到当前分支。
图片37.png
注意到上面的Fast-forward信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward。Fast forward模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git 就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。这时候我们需要使用--no-ff方式的git merge:
首先,仍然创建并切换dev分支:

git switch -c dev 

修改readme.txt文件,并提交一个新的commit:

git add readme.txt  
git commit -m "add merge" 

我们切换回master:

git switch master

准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:

git merge --no-ff -m "merge with no-ff" dev 

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
合并后,我们用git log看看分支历史:

$ git log --graph --pretty=oneline --abbrev-commit
*   fc76cf7 (HEAD -> master) merge with no-ff
|\  
| * f52c633 (dev) add merge
|/  
*   cf810e4 conflict fixed

可以看到,不使用Fast forward模式,merge后就像这样:

有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没办法合并它们,同时会提示文件冲突。此时需要我们打开冲突的文件并修复冲突内容,最后执行git add命令来标识冲突已解决
图片38.png

git branch -d [branch name] 删除分支

$ git branch -d dev
Deleted branch dev (was b6e4da9).

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
$ git branch
* master

如果要删除的分支中进行了一些开发动作,此时执行上面的删除命令并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D

注:如果要删除远程仓库中的分支,可以使用命令git push origin –d branchName

$ git push origin -d dev
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/helloMrZhan/gitCreateTest.git
 - [deleted]         dev

Administrator@ZCSAFTIYOEUBDJQ MINGW64 /e/gitCreateTest (master)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。