git相关教程 - 详细版(一)

一、相关介绍

1. 下载安装git

下载链接

2. git免密clone

linux下ssh公钥验证的设置和远程登录

2.1 客户端操作

ssh-keygen -t [rsa|dsa]

在目录 /home/yoyo/.ssh/id_rsa 将会生成 密钥文件私钥文件 id_rsaid_rsa.pubid_dsaid_dsa.pub

.pub 文件复制到git服务器的 /root/.ssh 目录下。

2.2 服务端操作

服务器端 /root/.ssh/ 目录下执行命令。

# 添加密钥
cat id_dsa.pub >> /root/.ssh/authorized_keys

# 设置authorized_keys权限
chmod 600 authorized_keys

# 设置.ssh目录权限
chmod 700 -R .ssh

免密测试

# 测试ssh免密码登录
ssh root@[IP]

3. git配置信息

1.6 起步 - 初次运行 Git 前的配置

3.1 全局config

该命令只需要运行一次,作用于全局配置

设置全局config

# 设置用户名、邮箱、密码
git config --global user.name "John Doe"
git config --global user.email "[email protected]邮箱"
git config --global user.password "xxxxx密码"

修改全局config

git config  --global user.name [用户名]
git config  --global user.email [邮箱名]

查看全局级config

# 查看全局级的 config
git config --global -l
或者
git config --global --list 
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户

查看系统级的config

git config --system -l
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置

查看git配置

# 查看用户名
git config user.name

# 查看邮箱
git config user.email

# 查看密码
git config user.password

# 查看已设配置
git config --list 

打开全局配置文件

vi ~/.gitconfig

3.2 项目config

为每个项目设置config文件。

打开项目配置文件

vi /PATH/TO/XXX.git/.git/config
或者
vi /PATH/TO/XXX.git/.git/.gitconfig

查看仓库级的 config

# 进入git服务器的项目目录
cd /PATH/TO/TCP_Hardware_Server.git 

# 查看仓库级的 config
git config --local -l

修改仓库级config

# 修改仓库级config
git config user.name [用户名]
git config user.email [邮箱名]

3.3 查看config 配置

# 查看当前生效的配置
git config -l

4. reset与revert

Git恢复之前版本的两种方法reset、revert(图文详解)

回退(reset)

反做(revert)

5. git lfs

git lfs原理和使用

5.1 问题引入

如果我们用git管理的项目中出现了一些大文件, 同时若其数量比较多, 而且更新又比较频繁, 那么当首次clone该项目时, 就会不可避免地将这些大文件的当前版本和历史所有版本的文件都下载下来, 虽然你很可能用不到这些历史文件, 但是却不得不为它们所占用的额外空间买单.

git lfs(large file storage)就很好地解决了这一问题.

5.2 git lfs简介

git lfs(large file storage) 通过将大文件替换为小指针的方式, 当你真正需要到这些大文件的时候, 它才会从本地或者远端的lfs缓存中下载这些大文件。

git lfs拥有本地lfs缓存和远端的lfs存储仓库。当你add一个文件时, git lfs用一个指针替换了其中的内容, 并将文件存储在本地的git lfs缓存中。

当你push一个文件时, 除了普通的文件会被正常push, 这些lfs文件也会被从本地lfs缓存传输到远端lfs存储仓库。

当你checkout一个包含lfs 指针的提交的时候, 那么指针文件就将被本地lfs缓存中的备份, 或者lfs存储库中的备份替换。

该指针当然也是一个文件, 内容如:

version https://git-lfs.github.com/spec/v1
oid sha256:5b62e134d2478ae0bbded57f6be8f048d8d916cb876f0656a8a6d1363716d999
size 285

参数解释:第一行是一个指针文件规范URL, 第二行是对象id, 第三行是文件有多少字节。

5.3 安装lfs(Ubuntu)

Installation · git-lfs/git-lfs Wiki · GitHub

在线安装
# ubuntu系统
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash

sudo apt-get install git-lfs

git lfs install
# CentOS 7
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
sudo yum install git-lfs -y
git lfs install
yoyo@yoyo:~/MyDocuments$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
Detected operating system as Ubuntu/jammy.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Detected apt version as 2.4.8
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/github_git-lfs.list...done.
Importing packagecloud gpg key... Packagecloud gpg key imported to /etc/apt/keyrings/github_git-lfs-archive-keyring.gpg
done.
Running apt-get update... done.

The repository is setup! You can now install packages.
root@root:~/MyDocuments$ sudo apt-get install git-lfs
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  git-lfs
0 upgraded, 1 newly installed, 0 to remove and 32 not upgraded.
Need to get 7,415 kB of archives.
After this operation, 16.0 MB of additional disk space will be used.
Ign:1 https://packagecloud.io/github/git-lfs/ubuntu jammy/main amd64 git-lfs amd64 3.3.0
Get:1 https://packagecloud.io/github/git-lfs/ubuntu jammy/main amd64 git-lfs amd64 3.3.0 [7,415 kB]
Fetched 7,415 kB in 57s (130 kB/s)
Selecting previously unselected package git-lfs.
(Reading database ... 95781 files and directories currently installed.)
Preparing to unpack .../git-lfs_3.3.0_amd64.deb ...
Unpacking git-lfs (3.3.0) ...
Setting up git-lfs (3.3.0) ...
Git LFS initialized.
Processing triggers for man-db (2.10.2-1) ...
Scanning processes...
root@root:~/MyDocuments$ git lfs install
Git LFS initialized.
离线安装

下载git-lfs

# 根据系统架构选择相应的版本下载
# x64
curl -OL https://github.com/git-lfs/git-lfs/releases/download/v3.1.2/git-lfs-linux-amd64-v3.1.2.tar.gz
# arm64
curl -OL https://github.com/git-lfs/git-lfs/releases/download/v3.1.2/git-lfs-linux-arm64-v3.1.2.tar.gz

tar -xvzf git-lfs-linux-amd64-v3.1.2.tar.gz
cd git-lfs-linux-amd64-v3.1.2

chmod 755 install.sh
sudo bash ./install.sh
git lfs install

5.4 git lfs简单使用

git lfs clone
# 正常clone
git clone

# 加速clone
git lfs clone
git lfs pull
# 正常下载lfs文件
git pull

# 如果lfs文件有丢失,下载丢失的lfs文件
git lfs pull
git lfs track
# 追踪指定的文件,用法与 .gitignore 类似
# 追踪的文件名单在 .gitattributes 文件中
git lfs track

# 取消追踪
git lfs untrack
git push

git push就可以提交并推送lfs内容到远端仓库。

6. git submodule

git submodule命令

git submoudule 使用

git submodule 是一个很好的多项目使用共同类库的工具,它允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commitpushpull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会的提交信息包含Submodule的信息,再clone父项目的时候可以把Submodule初始化。

6.1 添加子模块

# url为子模块的路径,path为该子模块存储的路径
git submodule add <url> <path>

# 默认情况下,子模块会放在当前目录下
git submodule add https://gitee.com/mindspore/akg.git
yoyo@yoyo:~/cache/demo$ git submodule add https://gitee.com/mindspore/akg.git
Cloning into '/home/yoyo/cache/demo/akg'...
remote: Enumerating objects: 22255, done.
remote: Counting objects: 100% (145/145), done.
remote: Compressing objects: 100% (136/136), done.
remote: Total 22255 (delta 88), reused 18 (delta 2), pack-reused 22110
Receiving objects: 100% (22255/22255), 18.36 MiB | 2.11 MiB/s, done.
Resolving deltas: 100% (15195/15195), done.

6.2 上传到gitee仓库

# 本地提交
git commit -m "add submodule: akg."

# 查看本地仓库关联的远程仓库 
git remote show origin
git remote -v

# 关联仓库
git remote add origin https://gitee.com/lljyoyo1995/demo-akg.git

# 提交远程分支
git push origin dev:dev
yoyo@yoyo:~/cache/demo$ git push origin dev:dev
Username for 'https://gitee.com': lljyoyo1995
Password for 'https://[email protected]':
Enumerating objects: 1123, done.
Counting objects: 100% (1123/1123), done.
Delta compression using up to 8 threads
Compressing objects: 100% (1121/1121), done.
Writing objects: 100% (1123/1123), 2.86 MiB | 2.37 MiB/s, done.
Total 1123 (delta 181), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (181/181), done.
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'dev' on Gitee by visiting:
remote:     https://gitee.com/lljyoyo1995/demo-akg/pull/new/lljyoyo1995:dev...lljyoyo1995:master
To https://gitee.com/lljyoyo1995/demo-akg.git
 * [new branch]      dev -> dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.

6.3 下载子模块

clone克隆项目后,默认子模块目录下无任何内容。需要在项目根目录执行如下命令完成子模块的下载。

git submodule update --init --recursive

或者
git submodule init
git submodule update

6.4 更新子模块

子模块的维护者提交了更新后,使用子模块的项目必须手动更新才能包含最新的提交。在项目中,进入到子模块目录下,执行 git pull更新,查看git log查看相应提交。完成后返回到项目目录,可以看到子模块有待提交的更新,使用git add,提交即可。

# 进入子模块
cd akg

# 执行更新
git pull

# 返回项目根目录,本地提交
git add .
git commit -m "xxx"

6.5 删除子模块

有时子模块的项目维护地址发生了变化,或者需要替换子模块,就需要删除原有的子模块。删除子模块较复杂,步骤如下:

# 删除子模块目录及源码
rm -rf 子模块目录 

# 删除项目目录下.gitmodules文件中子模块相关条目
vi .gitmodules 

# 删除配置项中子模块相关条目
vi .git/config 

# 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可
rm .git/module/* 

# 执行完成后,再执行添加子模块命令即可,如果仍然报错,执行如下:
git rm --cached 子模块名称

# 完成删除后,提交到仓库
git add .
git commit -m "xxx"

7. git tag

git tag (打标签)

Git 可以给仓库历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点 (v1.0、v2.0 等等)。

7.1 tag 与 branch 的区别

  • tag 对应某一次 commit,是一个点,只能查看,不可移动。tag 实现标记的功能,是 Git 版本库的一个快照,指向某个 commit 的指针。
  • branch 对应一系列 commit,是很多点连成的一根线,有一个 HEAD 指针,是可以依靠 HEAD 指针移动的。
  • tag 就像是一个里程碑,每一个标志一个点,branch 是一个新的征程一条线。tag 是静态的,branch 要向前开发。
  • tag 和 branch 相互配合使用,例如已经发布了 v1.0 v2.0 v3.0 等版本,在不改变现有代码的前提下,在 v2.0 的基础上加个新功能,作为 v4.0 发布。就可以检出 v2.0 的代码作为一个 branch,然后作为开发分支。

7.2 Listing Your Tags (列出标签)

# 显示tag列表
git tag -l
git tag --list

# 查找v2.8系列tag
git tag -l "v2.8.*"

# 显示指定tag的信息
git show v2.8.0
yoyo@yoyo:~/tensorflow_work/tensorflow_tag_v2.8.2/tensorflow$ git tag -l "v2.8.*"
v2.8.0
v2.8.0-rc0
v2.8.0-rc1
v2.8.1
v2.8.2
yoyo@yoyo:~/tensorflow_work/tensorflow_tag_v2.8.2/tensorflow$

7.3 Creating Tags (创建标签)

git tag -a v1.4 -m "my version is 1.4"

参数解释

  • -a:创建附注标签。
  • -m:附注的内容。

7.4 对指定的[commitID]创建tag

git log --pretty=oneline
git tag -a v1.2 9fceb02
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <[email protected]>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <[email protected]>
Date:   Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

7.5 Sharing Tags (共享标签)

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。这个过程就像共享远程分支一样,你可以运行 git push origin

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

7.6 Deleting Tags (删除标签)

# 删除本地tag
git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

# 删除远程tag
git push origin :refs/tags/v1.4-lw
或者
git push origin --delete <tagname>
git push origin :refs/tags/v1.4-lw
To /[email protected]:schacon/simplegit.git
 - [deleted]         v1.4-lw

7.7 Checking out Tags (检出标签)

# 从tag v2.8创建新branch,新branch命名为v2.8
git checkout -b v2.8.2 v2.8

二、常用指令

理解git中的head和master

1. 仓库相关

# 【客户端】初始化git仓库
git init

# 【服务端】初始化Git仓库
git init --bare TF_YOLO_v3_Project.git

# 克隆仓库A
git clone root@[IP]:/PATH/TO/TCP_Hardware_Server.git

# 把工作区所有修改添加到暂存区
git add .

# 提交到git仓库
git commit -m "push current files"

# 查看仓库状态
git status

2. 分支操作

# 查看所有本地分支
git branch -a
git branch

# 创建分支
git branch [分支名]

# 切换分支
git checkout [分支名]

# 切换master主分支
git checkout master

# 创建并切换分支
git checkout -b [分支名]

# 删除本地分支
git branch -d [分支名]
git branch -D [分支名]

# 删除远程分支
git push origin_101 --delete [分支名]

3. 远程仓库相关

本地新建分支, push到远程服务器上之后,使用git pull或者git pull 拉取或提交数据时会报错,必须使用命令:git pull origin dev(指定远程分支);如果想直接使用git pull或git push拉去提交数据就必须创建本地分支与远程分支的关联。

# 查看远程分支完整列表
git ls-remote

# 查看远端库基本信息
git remote show origin
git remote -v

# 查看远端库的分支情况
git branch -r 

# 克隆远程分支
git clone -b [指定分支名] [远程分支名]

# 新建本地分支与远程分支关联
git push –-set-upstream [本地分支名] [origin/远程分支名]

# 创建本地分支到远程分支的跟踪
git branch --set-upstream-to=master

# 取消对master的跟踪
git branch --unset-upstream master

# 删除已关联的远程主机
git remote rm origin

# 删除远程分支
git push origin --delete [远程分支名]

# 查看本地仓库关联的远程仓库
git remote show origin
git remote -v

# 拉取远程分支到本地
git pull origin [远程分支名] 

# 拉取远程分支与本地分支合并
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master:lljyoyo

# git pull 等价于:`git fetch` + `git merge`
1. 抓取远程仓库
git fetch [远程分支名]
2. 合并分支
git merge [远程分支名]

# 推送本地分支到远程
git push origin [本地分支名][远程分支名]
git push origin lljyoyo:master

# 推送当前分支到远程分支
git push [远程分支名]
git push origin

4. reset与revert

Git恢复之前版本的两种方法reset、revert(图文详解)

回退(reset)

反做(revert)

# 返回过去到最后一次提交位置
git reset --hard HEAD 

# 返回到倒数第二次版本
git reset --hard HEAD~ 

# 返回到前几次的某个版本
git reset --hard HEAD~n 

# 返回指定版本(返回后也可以回到将来版本)
git reset --hard [commit_id]

5. 比较diff修改差异

# 比较文件差异
git diff [文件名]

# 比较本地库历史记录和工作区中的文件修改
git diff [本地库中文件历史记录(指针)] [文件名]

# 比较最新一次修改
git diff HEAD test.txt  

# 比较上一次修改
git diff HEAD^ text.txt 

# 比较[commit_id]为 46e8eaa的修改
git diff 46e8eaa test.txt 

# 比较所有文件
git diff

6. git日志

# 查看代码提交记录
git log

# 查看简洁提交历史记录
git log --oneline

# 显示 ASCII 图形历史记录
git log --graph

# 查看所有分支的提交 ASCII 图形历史记录
git log --all --graph

# 查看最近2次提交的历史记录
git log -n2

# 创建版本号
git tag <name>

# 查看所有标签
git tag

# 查看指定的标签信息
git show <tagname>

# 标签打在指定的 [CommitcommitID] 上
git tag V0.9 24f92f4

# 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a V0.1 -m "version 0.1 released" 1186b5e

# 删除标签
# 创建的标签只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除
git tag -d V0.1

# 推送指定的标签到远程
git push origin <tagname>

# 推送所有的标签到远程
git push origin --tags

# 删除远程标签
# 如果标签已经推送到远程,先从本地删除,然后从远程删除
git tag -d V0.9
git push origin :refs/tags/V0.9

7. 其他指令

# 删除文件
git rm [文件]

# 删除文件夹
git rm test -r [文件夹]

# 暂存工作区
git stash 

# 恢复工作区(不删除暂存)
git stash apply 

# 删除工作区暂存
git stash drop 

# 恢复工作区(删除暂存)
git stash pop 

# 查看工作区暂存
git stash list 

8. git缓存区

git删除缓存区中文件

# 查看暂存区中文件信息
git ls-files -c 
git ls-files --cached

# 删除缓存,但不删除物理文件
git rm --cached "文件路径"

# 删除缓存,也删除物理文件
git rm --f "文件路径"

9. Git配置多个账号免密登录

三、常用技巧

1. 搭建git服务器

1.1 服务器端

# 创建文件夹,用于存放git仓库
mkdir xxx
cd xxx

# 初始化Git仓库
git init --bare TF_YOLO_v3_Project.git

# 添加 git 用户
# 为了不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常以.git结尾,把owner改为git
groupadd git
useradd git -g git
passwd git
修改密码:Assd2633

sudo chown -R git:git TF_YOLO_v3_Project.git

1.2 客户端

# 本地创建文件夹
mkdir xxx
cd xxx

# 初始化仓库
git init 

# 将本地仓库与远程仓库关联起来
git remote add origin(远程仓库名称) root@[IP]:/PATH/TO/TF_YOLO_v3_Project.git

# 在本地新建 dev分支,并切换到dev分支
git checkout -b dev

# 在远端服务器新建dev分支
git push --set-upstream origin(远程仓库名) dev

# 本地分支代码提交到服务器
git push origin 本地分支名:远端分支名
eg:git push origin(远程仓库名) lljyoyo:lljyoyo 
# 本地lljyoyo分支代码提交到远端lljyoyo分支

# 强制提交本地分支覆盖远程分支
git push origin [远程分支名称] --force 

# 删除远程的一条记录
git reset --hard [hash指纹]

2. git关联新仓库

2.1 关联git服务器

1. 备份本地分支,用作临时分支
git checkout -b lljyoyo_temp

2. 关联远程新仓库
git remote add origin_101 root@[IP]:/PATH/TO/TF_YOLO_v3_Project.git

3. 拉取远程新仓库
git pull origin_101 [分支名称]

4. 修改冲突,提交分支
git add .
git commit -m "xxx"

5. 提交到远程新分支
git push origin_101 lljyoyo_temp:lljyoyo

2.2 关联gitee

  1. 登录gitee账户,新建仓库;
    git相关教程 - 详细版(一)_第1张图片
  2. (如果本地已有仓库)提交本地代码,并关联远程gitee仓库;
    # 提交本地仓库
    git add .
    git commit -m "xxx"
    
    # 查看本地仓库关联的远程仓库
    git remote show origin
    git remote -v
    
    # 删除原有origin
    git remote rm origin
    
    # 关联远程gitee仓库
    git remote add origin https://gitee.com/xxx/acl_yolov3.git
    
    # push代码到远程gitee仓库
    git push -u origin "master"
    或者
    git push origin master:master
    
  3. (如果本地无仓库)新建本地仓库,并关联远程gitee仓库;
    # 新建文件夹,用于存放项目代码
    mkdir acl_yolov3
    cd acl_yolov3
    
    # 初始化仓库
    git init 
    
    # 编写代码
    ...
    
    # 提交本地代码
    git add .
    git commit -m "first commit"
    
    # 查看本地仓库关联的远程仓库
    git remote show origin
    git remote -v
    
    # 关联远程gitee仓库
    git remote add origin https://gitee.com/xxx/acl_yolov3.git
    
    # push代码到远程gitee仓库
    git push -u origin "master"
    或者
    git push origin master:master
    

如果git没有设置免密,则需要输入gitee的账号和密码,即为登录gitee账户的账号和密码

Username for 'https://gitee.com':
Password for 'https://[email protected]':
Enumerating objects: 160, done.
Counting objects: 100% (160/160), done.
Delta compression using up to 4 threads
Compressing objects: 100% (145/145), done.
Writing objects: 100% (160/160), 338.98 KiB | 741.00 KiB/s, done.
Total 160 (delta 40), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (40/40), done.
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/xxx/operator-development-le-ascendo.git
 * [new branch]      master -> master

3. git仓库合并

3.1 合并分支代码到主干

# 切换到develop分支:
git checkout develop

# 把develop分支代码拉取到本地:
git pull [remote] develop

# 切换到master主干:
git checkout master

# 合并develop分支代码到master:
git merge develop

# 提交到远程master主干
git push origin_101 master:master

3.2 合并主干代码到分支

# 切换到master主干
git checkout master

# 把master主干拉取到本地:
git pull <remote> master

# 切换到lljyoyo分支
git checkout lljyoyo

# 提交代码
# 根据提示,哪些文件发生了修改,将这些文件替换成最新的即可
git add .
git commit -m "xxx"

# 合并master到lljyoyo分支:
git merge master

# 提交到远程lljyoyo分支
git push origin_101 lljyoyo:lljyoyo

3.3 远程代码回滚

# 切换到指定分支
git checkout the_branch

# 拉取代码
git pull

# 备份当前分支
git branch the_branch_backup 

# 切换回 the_branch 分支
git checkout the_branch

# 本地回滚
git reset --hard [hash指纹] 

# 删除远程 the_branch
git push origin :the_branch

# 用回滚后的本地分支重新建立远程分支
git push origin the_branch

# 如果前面都成功了,删除这个备份分支
git push origin :the_branch_backup 

4. git删除远程记录

1. 新建一个lljyoyo分支
git branch -b lljyoyo

2. 拉取远程分支
git pull origin v1.0-develop

3. 备份本地的分支
git checkout -b lljyoyo_temp

4. 切换回原分支
git checkout lljyoyo

5. 查看本地的提交记录
git log --graph

6. 本地回滚
git reset --hard [hash值]

7. 强制更新远程分支
git push --force origin lljyoyo:v1.0-develop

8. 修改代码(或者文件替换),提交本地分支
git add .
git commit -m "xxx"

9. 更新远程分支
git push origin lljyoyo:v1.0-develop

5. gitlab教程

5.1 初次创建仓库

1. 在gitlab网页中手动创建git仓库 pro_koalo_onlyone

2. 将git仓库clone到本地
git clone ssh://git@[IP]:30001/algorithm/pro_koalo_onlyone.git

3. 进入clone下来的目录中
cd pro_koalo_onlyone

4. 新建本地分支
git checkout -b v1.0-develop

5. 将代码拷贝到本地分支中
如果提示是否合并,则不合并或者跳过

6. 添加到仓库
git add .

7. 提交到仓库
git commit -m "稳定版本_202005301413_lljyoyo"

8. 更新到远程仓库
git push origin v1.0-develop

5.2 提交代码到远程仓库

1. clone远程代码
git clone ssh://git@[IP]:30001/algorithm/pro_koalo_onlyone.git
git clone -b <指定分支名> ssh://git@[IP]:30001/algorithm/pro_koalo_onlyone.git

2. 新建本地最新版本的分支 lljyoyo
git checkout -b lljyoyo

3. 将代码拷贝到本地分支中
如果提示是否合并,则不合并或者跳过

4. 提交本地分支 lljyoyo 的代码到仓库中
git add .
git commit -m "xxx"

5. 切换到远程分支 v1.0-develop
如果提示需要新建分支,那新建一个和远程分支一样的分支 v1.0-develop
git checkout remote/origin/v1.0-develop
git checkout -b v1.0-develop

6. 将远程分支pull下来 
git pull origin v1.1-develop

7.1 如果发生冲突,根据提示,哪些文件发生了修改,将这些文件替换成最新的即可
https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344

7.2 git add .

7.3 git commit -m "xxx"

8. 合并分支 lljyoyo 到分支 v1.1-develop
git merge lljyoyo

9. 更新远程分支
git push origin v1.1-develop:v1.1-develop

6. 高效稳定的多人协作 git 代码提交流程

不能在 master 分支上修改任何文件,master 分支的变更只能通过 git pullgit merge 获得

6.1 本地 dev 分支开发

# 创建并转到 dev 分支
# dev分支用于修改本地修改代码
git checkout -b dev

# 查看当前分支,当前在 dev 分支
git branch

# 查看 dev 分支工作区代码跟 dev 分支暂存区的差别
git status

# 将 dev 分支工作区修改过的所有代码添加到暂存区,. 代表当前目录
git add .

# 将暂存区的代码添加到本地仓库 dev 分支
git commit -m "注释"

# dev 分支的工作区同步到本地 master 分支
git merge origin master

6.2 合并本地分支与提交到远程master

# 切换到 master 分支
git checkout master

# 同步线上 master 仓库,确保当前 master 分支是最新代码
git pull 

# 合并 dev 分支到 master
git merge dev

# 推送到远程 master 分支(须当前在 master 分支)
git push origin master

# 推送到线上 dev 分支(须当前在 dev 分支)
git push origin dev

# 开发完成,删除本地 dev 分支
git branch -d dev

# 删除远程的 dev 分支(可选)
git push origin :dev

6.3 fork拉取上游仓库

通过 fork 将上游仓库的项目复制到自己仓库中,当上游的仓库变更时,通过 pull 命令同步更新到自己仓库。

# 查看本地仓库关联的远程仓库
git remote show origin
git remote -v

# 添加上游仓库的 Git URL,默认名为 upstream
git remote add upstream ssh://[email protected]/***/***.git
git remote add origin https://gitee.com/xxx/acl_yolov3.git

# 拉取上游仓库的 master 分支到本地
git pull upstream master

6.4 本地创建的仓库关联远程仓库

通过添加 remote 关联远程仓库。

# 查看本地仓库关联的远程仓库
git remote show origin
git remote -v

git remote add origin [仓库地址URL]

# 远程仓库为非空项目,没关联提交,允许拉取合并
git pull origin master --allow-unrelated-histories

git push origin master

四、可能出现的问题

Q: 远程 HEAD 指向一个不存在的引用

git clone下载代码提示不存在HEAD指向的文件

git clone 下载一个仓库出现一个警告,没有生成相关的代码
  warning: 远程 HEAD 指向一个不存在的引用,无法检出。
  warning: remote HEAD refers to nonexistent ref, unable to checkout.
解决方案:
1. git clone克隆代码
mkdir demo_file
git clone root@[IP]:/PATH/TO/TF_YOLO_v3_Project.git
cd TF_YOLO_v3_Project

2. 查看分支
git branch
git branch -a

3. 切换分支
git checkout remotes/origin/lljyoyo
git branch -a

4. 创建本地分支
git checkout -b lljyoyo

Q: Automatic merge failed

git常见问题之git pull时Automatic merge failed; fix conflicts and then commit the result

错误原因:
本地分支与远程分支内容不一样,拉取远程分支失败

解决方案:
1. 先提交本地分支 lljyoyo
2. 再创建新分支 develop
3. 切换到新分支,拉取远程分支
4. 切换回原分支,合并远程分支 git merge develop
5. 如果提示合并失败,那用pycharm打开项目,修改报错的代码
6. 修改完成之后,提交本地分支 lljyoyo
7. 推送本地分支到远程分支 git push origin_101 lljyoyo 

Q: gitlab克隆代码出错

Cloning into 'device_video_play'...
> GitLab: The project you were looking for could not be found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
错误原因:
ssh公钥验证失败

解决方法:
重新生成ssh公钥
ssh-keygen -t rsa

在目录 `/home/yoyo/.ssh` 生成公钥 `id_rsa.pub`,再添加到 gitlab SSH Keys 中。

Q: failed to push some refs to

git 错误error: failed to push some refs to error: failed to push some refs to '[email protected]:....." Updates were rejected because the remote contains work that you do not have locally.

This is usually caused by another repository pushing to
错误原因:
本地和远程的文件应该合并后才能上传本地的新文件

解决方法:
1、先拉下来,会自动合并的(不用操心)
git pull origin lljyoyo

2、再上传
git push origin lljyoyo:lljyoyo

Q:`fatal: detected dubious ownership in repository at ‘/data/yoyo/mindspore’

To add an exception for this directory`

root@44ff3bb0ad1d:/data/yoyo/mindspore# git log --graph 
fatal: detected dubious ownership in repository at '/data/yoyo/mindspore'
To add an exception for this directory, call:

        git config --global --add safe.directory /data/yoyo/mindspore
解决办法:
git config --global --add safe.directory /data/yoyo/mindspore

你可能感兴趣的:(运维,git)