工具篇--从零开始学Git

一、git概述

1.1版本控制方式

 集中式版本控制工具
     集中式版本控制工具,版本库是集中存放在中央服务器的,
     team 里每个人 work 时从中央服务器下载代码,是必须联网才能工作,
     局域网或互联网,个人修改之后,然后提交中央版本库。
     举例:SVN 和 CVS
 分布式版本控制工具
     在分布式版本控制系统没有 "中央服务器",每个人电脑上都是一个完整的版本库,
     这样工作的时候,无需联网了,因为版本库就在你自己电脑上,
     多人协作只需要各自的修改推送给对方,就能互相看到对方修改了。
     举例:Git

1.2安裝

windows版本

官方下载(比较慢):Git - Downloads

Linux版本

​yum install git

查看git版本。

git --version

 1.3创建仓库gitee

注册账号 Gitee - 基于 Git 的代码托管和研发协作平台
新建仓库 honey2024

配置

git config --global user.email "your_email@example.com"
git config --global user.name "username"

要查看 Git 的用户名和邮箱,你可以使用以下命令:

git config --global user.name
git config --global user.email

  1. 输入 git init 把这个目录变成一个 git 仓库
  2. 本地仓库跟远程的仓库建立连接
  3. 新建 .gitignore文件
    .idea
    node_modules
    *.iml
  4. 暂存代码 git add . (要注意当前的仓库是否存在旧的仓库文件夹 .git,如果存在要删除掉)
    # 把当前目录除了 .gitignore描述之外的所有文件全部加入到暂存区
    git add .
  5. 提交文件到本地仓库
    git commit -m '初次提交'

解决git bash 终端显示中文乱码

git config --global core.quotepath false

6.推送代码到远程仓库

git push -u origin "master"

强制覆盖远程仓库
git push -f origin "master"

总结

# 配置
# 全局配置
git config --global user.email "your_email@example.com"
git config --global user.name "username"
# 仓库配置
git config user.email "your_email@example.com"
git config user.name "username"git config --global --list
git config --list# 新建仓库
git init
# 添加远程仓库
git remote add origin ''
# 查看远程仓库
git remote -v# 添加文件到暂存区
git add .
# 查看状态
git status
# 忽略文件
.gitignore文件# 提交
git commit -m 'init'# 拉取远程代码
git pull origin master
# 强制推送代码到远程仓库
git push -f origin master# 克隆代码
git clone ''

1.4idea配置git

安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到Version Control下的git选项:

 如果idea终端输入git命令无法识别解决办法

Idea打开setting->搜索git->Version Control->Git->将Path to Git executable地址修改为->Git\cmd\git.exe
如下图

接着在上面搜索框中搜索tools->找到下面的Terminal->将Shell Path改为->Git\bin\bash.exe最后点击确认。
如下图:

git init                           //初始化仓库
git add .(文件name)                //添加文件到本地 
git commit -m “first commit”      //添加文件描述信息
git remote add origin  远程仓库地址 //链接远程仓库 
git pull origin master           // 把本地仓库的变化连接到远程仓库master                                     分支
git push -u origin master        //把本地仓库的文件推送到远程仓库master                                    分支

 idea开启远程

IDEA常用GIT操作入口

1.5开发中的实际场景

场景一:备份
     小明负责的模块就要完成了,就在即将 Release 之前的一瞬间,
     电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流
 ​
 场景二:代码还原
     这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,
     可是这杯改得面目全非的代码已经回不去从前了,什么地方能买到哆啦A梦的时光机啊?
 ​
 场景三:协同开发
     小刚和小天先后从文件服务器上下载了同一个文件:Analysis.java,
     小刚在 Analysis.java 文件中的第 30 行声明了一个方法,叫 count(),
     先保存到了文件服务器上,于是,count()方法只存在于小刚的记忆中了
    
 场景四:追溯问题代码的编写人和编写时间!
     老王是另一位项目经理,每次因为项目进度挨骂之后,
     他都不知道该扣哪个程序员的工资!就拿这次来说吧,
     有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!
     可是二胖、王东、刘流和正经牛都不承认是自己干的!

二、工作原理

2.1基本概念:工作区、暂存区、版本库、远程仓库

  • 工作区(Workspace):本地存放文件的地方。Git会知道这里的文件变更,如添加/修改/删除文件。
  • 暂存区(Stage/Index):临时存放文件变更信息,事实上它是一个名为index的文件。
  • 版本库(Repository):工作区有一个隐藏目录.git,它是Git的版本库,为了与远程仓库区分,将其明确称为本地版本库(Local Repository)。其中有一个HEAD指向当前版本库版本。
  • 远程仓库(Remote Directory):托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。

2.2 Git文件操作 

创建仓库(git init)

创建本地仓库的方法有两种:一种是本地创建全新仓库,另一种是克隆远程仓库

本地创建全新仓库,初始化一个版本库:

git init

 提交变更(git add, git commit)

下面介绍提交变更到本地版本库的基本流程。

准备工作:先新建一个目录learngit,并创建README.md文件,随便写入一句话。

mkdir learngit
cd learngit
touch README.md
echo "# Hello, git!" >> README.md

添加文件变更到版本库,分两步:

  • 使用命令git add <file>,可多次使用,添加多个文件。
  • 使用命令git commit -m <message>,文件从暂存区提交到版本库;<message>表示提交的信息。
git init #初始化一个git的本地仓库
git add README.md #将工作区README.md文件的变更移动到暂存区
git commit -m "add README.md" #将暂存区提交到本地仓库

在IntelliJ IDEA中,“提交”对应于Git的**git commit命令,而“推送”对应于Git的git push**命令。具体如下:

  • 提交(Commit):在IDEA中执行提交操作通常通过VCS菜单下的Commit选项或者快捷键Ctrl+K来进行。这个操作会将你在本机工作目录中对文件所做的修改保存到本地的Git仓库中。提交时,你需要编写提交信息来描述本次提交包含的更改。
  • 推送(Push):在IDEA中推送代码到远程仓库通常是通过VCS菜单下的Push选项进行。对应的Git命令是git push,它会将本地仓库中的提交推送到配置好的远程仓库,如GitHub或GitLab等。在进行推送之前,需要确保本地仓库与远程仓库已经关联,并且设置了正确的远程仓库地址。

需要注意的是,在实际操作中,为了确保其他人能够顺利拉取(Pull)你的更改,建议在推送之前先执行git pullgit fetch来获取最新的远程更改,并解决可能出现的合并冲突。

 

 管理变更(git add/rm, git restore)

理解:Git跟踪并管理的是变更,而不是文件。

  • 撤销工作区变更(撤销对工作区文件的添加/修改/删除):git restore <filename> 或 git checkout -- <filename>

  • 撤销暂存区变更(撤销git add/rm):git restore --staged <filename> 或 git reset HEAD <filename>

echo "after git add" >> README.md #在工作区修改README.md,用git status可以看到被修改,但这一变更未加到暂存区
git add README.md #变更被加到暂存区
git restore --staged README.md #撤销暂存区的变更(README.md的修改),注意,此时工作区文件还是没有变
git restore README.md #撤销工作区的变更,即工作区README.md文件被还原成修改前git rm README.md #在工作区删除README.md,并且这一变更被加到暂存区
git restore --staged README.md #撤销暂存区的变更(README.md的删除),注意,此时工作区文件还是没有变
git restore README.md #撤销工作区的变更,即工作区README.md文件被还原成删除前

 相当于

在IntelliJ IDEA中,回滚操作对应于Git的git reset命令

具体来说,IntelliJ IDEA提供了一种直观的方式来回滚到特定的版本

 版本回退(git reset)

Git允许我们在版本的历史之间穿梭,实际上就是移动HEAD指向的位置(HEAD指向的版本就是当前版本)。

git log可以查看提交历史,即历史每次提交的<commit_id>,以便确定要回退到哪个版本。

git reflog可以查看命令历史,即所有分支的所有操作记录(包括commitresetcheckoutmerge等操作)。

指定版本到<commit_id>:

git reset --hard <commit_id> #当前分支和HEAD均指向<commit_id>

回退到当前HEAD的上一个commit,撤销暂存区变更(撤销commit和add):

git reset --hard HEAD~1 #HEAD~1表示上一个commit版本,如果是往上两个版本就是HEAD~2;当前版本就是HEAD

回退到当前HEAD的上一个commit,不撤销暂存区变更(撤销commit):

git reset --soft HEAD~1

详情请见Git分布式管理-头歌实验日志和版本回退 

 查看命令(git status, git log, git reflog, git diff)

  • git status 查看git仓库中,工作区、暂存区、版本库的当前状态。
  • git log 查看提交历史。可加选项:
    • --oneline 每行显示一个commit。例如显示9af21bf add README.md,那么<commit_id>前几个字符就是9af21bf
    • --all 显示所有分支的提交历史,否则只显示当前分支的提交历史。
    • --graph 显示分支合并,以横线形式连接曾有过合并的各个提交。
  • git reflog 查看命令历史。
  • git diff 查看工作区和暂存区差异。
  • git diff --cached 查看暂存区和版本库差异。
  • git diff -- HEAD~1 查看工作区和版本库的差异。HEAD~1可以改成HEADHEAD~2等等。
  • git diff HEAD HEAD~1 查看版本库HEAD与版本库HEAD~1之间的差异(最新的commit和上一次commit)。

git log相当于idea

查看提交记录​命令: git log [option]option–-all 显示所有分支–-pretty=oneline 将提交信息显示为一行–-abbrev-commit 使得输出的commitId更简短–-graph 以图的形式显示

 git status 相当于idea

小结:提交变更 + 管理变更

本地仓库的各项管理命令可以参照下图方便记忆(从右往左看):

  • 工作区变更:任意的添加/修改/删除文件。
    • 撤销工作区变更:git restore <filename> 或 git checkout -- <filename>
  • git add 工作区→暂存区添加文件变更。
    • 撤销add:git restore --staged <filename> 或 git reset HEAD <filename>
  • git commit 暂存区→版本库提交文件变更。
    • 撤销commit:git reset --soft <commit_id>
    • 撤销commit和add:git reset --hard <commit_id>

2.3分支管理

查看/创建/切换/删除分支(git branch, git switch)

查看本地分支:

git branch #要查看远程分支则加上选项-r,查看所有分支则加上选项-a

创建分支:

git branch <name>

切换分支:

git switch <name> #等价于git checkout <name> (注意:switch命令是git 2.23版本的新命令)

创建+切换分支:

git switch -c <name> #等价于git checkout -b <name>

删除普通分支:

git branch -d <name>

强制删除未合并的分支:

git branch -D <name>

在IntelliJ IDEA中,查看、创建、切换和删除分支的操作具体如下:

  1. 查看分支
  • 通过主菜单VCS -> Git -> Branches,可以查看当前项目的所有分支情况。
  • Version Control窗口中,选择Log选项卡,可以看到提交历史以及各个分支之间的关系。
  1. 创建分支
  • Version Control窗口中,选择Local Changes选项卡,右键点击想要基于其创建分支的文件或目录,选择Git -> New Branch
  • 输入新分支的名称,然后IDEA会将更改保存到新分支上。
  1. 切换分支
  • Version Control窗口中,选择Local Changes选项卡,找到你想要切换到的分支,右键点击并选择Checkout as New Branch
  • 如果需要切换到远程分支,可以通过VCS -> Git -> Fetch来先获取远程分支的最新信息,然后再进行切换。
  1. 删除分支
  • Version Control窗口中,选择Local Changes选项卡,找到你想要删除的本地分支,右键点击并选择Git -> Delete Branch
  • 如果是远程分支,你需要先用Push操作将本地更改同步到远程仓库,然后再进行删除。

`git branch -vv` 命令用于列出所有本地分支及其关联的提交和上游分支。`-vv` 选项代表 "非常详细"。

当你运行此命令时,你将看到类似于以下的输出:

```bash
master 1a2b3c4 [origin/master] 最后一次提交的信息
```

在这个输出中:

- `master` 是本地分支的名称。
- `1a2b3c4` 是分支当前指向的提交。
- `[origin/master]` 是与本地分支关联的上游分支。
- `最后一次提交的信息` 是该分支上最后一次提交的信息。

当你想查看所有本地分支的状态,包括每个分支跟踪的内容以及它们是否领先、落后或已分叉时,这个命令非常有用。

合并分支(git merge)

  • 快速合并(Fast-forward):合并当前分支(旧)到某分支(新)的位置。
git merge <name> #某分支名为<name>
  • 非快速合并:合并当前分支+某分支,产生一个新的提交,合并到这个新提交的位置,这样可以保存之前的分支历史。
git merge --no-ff -m <message> #<message>表示新提交的信息

操作示例:

首先创建并切换到分支feature,并在feature分支上进行一次提交。

# 首先用git status看看是否位于分支master(如果不是就用git switch master先切换一下)
git switch -c feature #创建并切换到分支feature
echo "add merge" >> README.md #修改README.md
git add README.md 
git commit -m "add merge" #提交

 则此时状态如下图(蓝线表示master分支,红线表示feature分支):

然后,用git switch master切换回master分支。此后,HEAD指向master

接下来请任选(1)或(2)的命令全部执行一遍,即选择你的合并策略(Fast-forward 或 no-fast-forward)。

(1)快速合并

git merge feature

git log --oneline --graph显示历史提交信息如下:

* f7a06a2 (HEAD -> master, feature) add merge

* e0e4ca3 conflict fixed (注:这里是你上一次的提交信息,与合并无关)

合并后的状态如下图:

(2)非快速合并

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

git log --oneline --graph显示历史提交信息如下:

* fc7e0ee (HEAD -> master) merge with no-ff

|\

| * d4d0ec9 (feature) add merge

|/

* e0e4ca3 conflict fixed (注:这里是你上一次的提交信息,与合并无关)

合并后的状态如下图:

(选做)最后,可以用git branch -d feature删除feature分支。

详情请见

Git分布式管理-头歌实验分支管理

 bug分支(git stash, git cherry-pick) 

假设现在有master, feature分支,你在feature分支上进行工作,写一个hello.py文件,并将其添加到了暂存区。

git switch feature #切换到feature分支,如果没有这个分支就用git switch -c feature创建并切换
touch hello.py & echo "print('hello')" >> hello.py #创建了一个python代码文件并写入了内容
git add hello.py #将变动加至暂存区

git add之后,用git status可以看到"hello.py的变更处于待提交状态"。

此时,突然发现有一个紧急的bug需要修复,但hello.py还没有写完,暂时无法commit。

于是你打算创建一个新的bug分支,但当前分支的工作状态必须先保存下来,那么可以用:

git stash

git stash可以把当前工作状态储存到stash这个栈之中,等以后出栈,即可还原现场,继续工作。

当前工作状态入栈后,再用git status可以看到"无文件要提交,干净的工作区"。

假设要在feature分支上修复bug,那么就在feature分支上创建并切换到bug分支(命名为issue-101)。假设修复bug就是修改README.md文件,修复完就commit。

#现在位于feature分支进行操作,然后创建并切换到bug分支
git switch -c issue-101 #bug分支
echo "Fixed the bug of README.md" >> README.md
git add README.md
git commit -m "fix bug 101"

然后,再切换回feature分支,将bug分支与feature分支进行非快速合并:

git switch feature
git merge issue-101 --no-ff -m "merged bug fix 101"

那么此时,已经完成了bug修复,可以重返当时储存的工作状态了:

git stash pop #将栈顶的工作状态出栈,同时删除栈顶内容

到此为止,我们就完成了feature分支上bug的修复过程,总结一下流程:

  1. feature分支,用git stash保存工作状态。
  2. 切换到bug分支,修复完bug,commit
  3. 切换回feature分支,将bug分支与feature分支合并。用git stash pop还原工作状态。

现在我们已经修复了feature分支上的bug,假设master分支上也要修复相同的bug,怎么办?

不用那么麻烦的再做一遍修复bug、合并分支的工作,可以用git cherry-pick <commit_id>,它能把bug分支的commit操作直接"复制",然后commit到当前分支:

git switch master
git stash # 如果master分支上有待提交的变更,那么必须先保存状态
git cherry-pick 8436eb8 #8436eb8是修复bug的<commit_id>,可用git log查看为8436eb8 (issue-101) fix bug 101
git stash pop

(选做)如果你需要保存多个工作状态,可以多次入栈。想恢复某个工作状态的时候,先用git stash list查看stash内容,再用git stash apply恢复到指定的工作状态:

git stash list # 查看stash内容
git stash apply stash@{0} #栈顶为stash@{0},栈顶的下一个为stash@{1}

注意:git stash apply并不会删除栈内的任何内容,但git stash pop将栈顶工作状态出栈的同时也会删除栈顶的内容。

开发中分支使用原则与流程

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

在开发中,一般有如下分支使用原则与流程:

 master (生产) 分支

线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;

 develop(开发)分支

是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,
都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。

 feature/xxxx分支

从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后

合并到develop分支。

 hotfix/xxxx分支

从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支

 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。


master分支是主分支,是线上发布的分支。上线代码必须是从master分支上线,其它分支是不可能上线的。

develop(开发分支),这是开发过程中的主要分支,它可以根据项目功能开发的分出不同的feature分支。feature分支功能开发完成后合并到develop分支,合并后记得删除对应feature分支(因为功能完成不需要了)

小结:

  • git stash 暂存当前工作状态,等恢复现场后继续工作

  • git stash list 查看所有暂存的工作状态

  • git stash pop 恢复工作状态,删除栈顶内容

  • git stash apply 恢复工作状态,不删除栈内内容

  • git stash drop 删除栈顶内容

2.4 远程仓库

在本章,你需要有一个GitHub账号,并且在GitHub上添加了一个远程仓库。远程仓库是指托管在互联网的版本库。

配置git

设置用户名和邮箱。

git config --global user.email "your_email@example.com" # --global表示全局设置
git config --global user.name "your_name"

查看配置。

git config -l

将SSH Key添加到GitHub。

ssh-keygen -t rsa -C "your_email@example.com" # 结果显示:Your public key has been saved in /root/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa.pub # 查看公钥并将其复制,之后粘贴到GitHub网页上

在GitHub网页中,点击个人头像 → Settings → SSH and GPG keys → New SSH key,添加公钥。

 克隆远程仓库(git clone)

git clone <url> #远程服务器的URL

当你克隆某个远程仓库后,默认情况下Git会自动设置本地master分支跟踪克隆的远程仓库的master分支(或其它名字的默认分支),并且默认设置远程仓库在本地的别名是origin

实际上克隆命令是git clone <repo>,表示克隆⼀个指定repo到本地,其指定repo可以是本地⽂件系统或者由HTTP或SSH指定的远程路径。

 添加/删除远程仓库(git remote add/rm)

(1)添加远程仓库

实际就是给远程仓库服务器地址起一个本地的别名/简称(习惯命名为origin)。

将远程服务器地址<url> 映射为 本地对远程服务器的别名<shortname>,命令格式如下:

 git remote add <shortname> <url> #将<shortname>与<url>关联,以后就可以用<shortname>代替<url>

示例:

#进入GitHub远程仓库的网页,点击Code和SSH,查看SSH协议的<url>,例如git@github.com:nefu-ljw/ACM-Algorithm.git
git remote add origin git@github.com:.git

(2)删除远程仓库

git remote rm <shortname> #删除别名<shortname>及其对应的远程服务器地址

一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。

推送远程仓库(git push)

将本地仓库的分支<branch>推送到远程服务器<remote>,命令格式如下:

git push <remote> <branch> # 这里的<remote>就是之前添加的远程服务器地址的别名<shortname>

如果是第一次将本地分支master推送到远程服务器origin,则使用-u选项指定一个默认服务器:

git push -u origin master #之后会产生远程分支origin/master,并且本地分支master跟踪远程分支origin/master

如果当前分支与多个服务器存在跟踪关系,可以使用-u选项指定一个默认服务器,以后就可以不加任何参数直接使用git push

当你和其他人在同一时间克隆,但他们先推送然后你再推送,那么你的推送会被拒绝,因为你要推送的本地分支落后于远程服务器的分支。你必须先抓取(fetch)他们的工作并将其合并(merge)进你的工作后才能推送。或者用-force选项强行推送你的本地库,但是这样会使得远程服务器丢失其他人的变更,请慎重使用。

注:git push需要输入用户名和密码,输入密码时可能出现要求输入token的问题,可参考此文解决。

命令
git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名] ]-f 表示强制覆盖
(如果本地代码和云端代码修改了同一个东西产生冲突,不让推送,可以使用-f强制覆盖,以提交的为准)​–set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。(远端分支与本地分支进行关联)git push --set-upstream origin master:maste

 查看远程仓库(git remote -v/show)

如果想查看已经配置的远程仓库服务器,可以用git remote列出已指定的每一个远程服务器的简写。

你也可以指定选项-v,将会显示远程服务器使用的简写<shortname>与其对应的<url>

git remote -v

运行命令后,将会显示可以进行抓取(fetch)和推送(push)的地址:

origin git@github.com:nefu-ljw/ACM-Algorithm.git (fetch)

origin git@github.com:nefu-ljw/ACM-Algorithm.git (push) (注:如果没有推送权限,则看不到push的地址)

如果你已经克隆了仓库,那么至少能看到origin,这是Git给你克隆的远程服务器的默认别名。

如果想要查看某一远程仓库<remote>的更多信息,可以用:

git remote show <remote>
  • 这个命令列出了当你在特定的分支上执行git push会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了, 还有当你执行git pull时哪些本地分支可以与它跟踪的远程分支自动合并。

抓取/拉取远程仓库(git fetch, git pull) 

如果远程服务器的数据有更新,要将这些新数据下载到本地,可以用git fetchgit pull

(1)抓取远程仓库(fetch

a. 访问远程服务器,从中抓取所有所有分支的更新:

git fetch <remote> #从远程仓库服务器<remote>中抓取所有分支的更新

b. 如果只想取回特定分支的更新,可以指定分支名:

git fetch <remote> <branch> #例如git fetch origin master

(2)拉取远程仓库(pull,即fetch+merge

a. 取回远程服务器<remote>某个分支<remote_branch>的更新,再与本地的指定分支<local_branch>合并:

git pull <remote> <remote_branch>:<local_branch>

示例,取回远程服务器origin的分支feature,与本地分支master合并:

git pull origin feature:master

b. 如果远程分支是与本地当前分支合并,则可省略:<local_branch>,如下:

git pull origin feature #等价于先fetch,再merge

这会让featureFETCH_HEAD中临时保留一个副本,并更新远程跟踪分支origin/feature

等价于,先fetch,再merge

git fetch origin #将远程服务器origin的所有分支取回到本地,比如远程分支feature的本地副本为origin/feature
git merge origin/feature #将远程分支origin/feature合并到当前分支

(3)抓取(fetch)与拉取(pull)的区别

  • git fetch:获取远程服务器的更新到本地,不自动合并到本地分支。

  • git pull:获取远程服务器的更新到本地,自动合并到本地分支。

查看/跟踪/删除 本地分支与远程分支(git branch -a/-vv/–track/–set-upstream-to/-dr, git push origin --delete)

(1)查看本地分支和远程分支:

git branch -a

例如,显示有本地分支feature、远程分支origin/feature,则表示你在本地库中拥有masterorigin/master,其中origin/master代表远程库中master分支的本地副本。

(2)查看本地分支和远程分支的跟踪关系:

git branch -vv

2.5配置别名和配置文件

配置别名

有些 常用的指令参数 非常多,每次都要输入好多参数,我们可以使用别名。

  • 打开 用户目录,创建 .bashrc 文件

部分 windows 系统不运行用户创建点号开头的文件,可以打开 gitBash,执行 touch ~/.bashrc

配置文件

配置Git的时候,加上--global是针对当前用户(终端用户)起作用的,如果不加,那只针对当前的仓库起作用。

怎么查看配置文件,它们放在哪?

  • 查看当前用户的配置信息: git config --global --list ,当前用户的global配置在用户主目录下的.gitconfig

  • 查看当前仓库的配置信息:git config --local --list ,当前仓库的local配置在仓库路径下的 .git/config

每个仓库的Git配置文件都放在.git/config文件中。别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

2.6配置SSH公钥

在git中clone项目有两种方式:HTTPS和SSH,它们的区别如下:

  • HTTPS:不管是谁,拿到url随便clone,但是在 push 的时候需要验证用户名和密码。
  • SSH:clone的项目你必须是拥有者或者管理员,而且需要在clone前添加SSH Key。SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。

仓库推送,推送仓库不是随意人员就可以的,码云会确认推送着是否为本人,有几种方案:1输入码云的登录用户名密码——https 2.公私钥对——ssh 一般情况使用第二种公私钥对,所以需要配置公私钥对

 生成SSH公钥

ssh-keygen -t rsa (Git Bash输入生成身份验证密钥)全部回车,采用默认值如果公钥已经存在,则自动覆盖

获取公钥

cat ~/.ssh/id_rsa.pub

配置公匙

验证是否配置成功
ssh -T git@gitee.com

输入后会出现提示,第一次访问gitee.com,?后输入yes即可

三、解决冲突

原则:工作第一件事pull

模拟冲突:两个成员修改了同一处的代码,成员1先提交推送了,成员2还没提交。推送解决办法:成员2先提交到本地仓库,进行拉取pull操作。在本地解决完冲突在进行推送

成员1修改后提交推送内容

成员2也在同一处修改内容

解决:

成员2先提交到本地仓库

 

执行拉取pull操作

手动合并,并重新加入暂存区

 

冲突解决,成员2进行推送

成员1重新拉取

 

如果当两个人修改了同一个地方,成员1提交推送了,成员2也提交推送,这是会弹出解决冲突合并的提示,如下图。解决办法同上。

总结:工作前第一件是就是pull

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场&#xff0c;拓展海外营销渠道的时候&#xff0c;如果单纯依靠一个小公司去国外做广告&#xff0c;拉渠道&#xff0c;找代理公司&#xff0c;从售前到售后&#xff0c;都是非常不现实的。我们可以回想一下40年前&#xff0c;30年前&#x…

【学习记录】调试千寻服务+DTU+导远RTK过程的记录

最近调试车载定位的时候&#xff0c;遇到了一些问题&#xff0c;千寻服务已经正确配置到RTK里面了&#xff0c;但是导远的定位设备一直显示RTK浮动解&#xff0c;通过千寻服务后台查看状态&#xff0c;长时间显示不合法的GGA值。 首先&#xff0c;通过四处查资料&#xff0c;千…

嵌入式面经-ARM体系架构-计算机基础

嵌入式系统分层 操作系统的作用&#xff1a;向下管理硬件&#xff0c;向上提供接口&#xff08;API&#xff09; 应用开发&#xff1a;使用操作系统提供的接口&#xff08;API&#xff09;&#xff0c;做上层的应用程序开发&#xff0c;基本不用去关内核操作硬件是怎么实现的 …

网络架构层_服务器上下行宽带

网络架构层_服务器上下行宽带 解释一 云服务器ECS网络带宽的概念、计费、安全及使用限制_云服务器 ECS(ECS)-阿里云帮助中心 网络带宽是指在单位时间&#xff08;一般指的是1秒钟&#xff09;内能传输的数据量&#xff0c;带宽数值越大表示传输能力越强&#xff0c;即在单位…

蓝桥杯第十一届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十一届比赛原题 1.比赛题目 2.赛题解读 1&#xff09;计数功能 2&#xff09;连续按下无效按键 二、部分功能实现 1.计数功能的实现 2.连续按下无效按键的处理 3.其他处理 1&#xff09;对于…

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;暂未发表&#xff09; 24.sqlite3_cr…

OSCP靶场--BlackGate

OSCP靶场–BlackGate 考点(1.redis rce 2. CVE-2021-4034提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.163.176 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-14 03:32 EDT Nmap scan report for 192.168.163.…

牛-迈面试题----答案/类似题/知识点

来源在这里 来源在这里 1.Redis的优势 (1) 速度快&#xff0c;因为数据存在内存中&#xff0c;类似于HashMap&#xff0c;HashMap的优势就是查找和操作的时间复杂度都很低 (2)支持丰富数据类型&#xff0c;支持string&#xff0c;list&#xff0c;set&#xff0c;sorted set&…

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

《系统架构设计师教程(第2版)》第6章-数据库设计基础知识-04-应用程序与数据库的交互

文章目录 1. 库函数级别访问接口2. 嵌入SQL访问接口2.1 概述2.2 数据库厂商 3. 通用数据接口标准3.1 开放数据库连接 (ODBC)3.2 一些数据库接口1&#xff09;数据库访问对象 (DAO)2&#xff09;远程数据库对象 (RDO)3&#xff09;ActiveX数据对象 (ADO)4&#xff09;Java数据库…

【科普文】三种处理器:CPU,GPU,NPU到底是什么?

更多内容在 从最早的CPU到GPU, 再到现在的NPU。处理器的型号和种类越来越多。每种处理器适用与不同的产品以及功能。下面来介绍三种处理器的区别和应用场景 CPU (中央处理器) CPU是计算机系统的核心&#xff0c;负责执行程序指令、处理数据和控制其他硬件设备。它通常由控制单…

Ollama管理本地开源大模型,用Open WebUI访问Ollama接口

现在开源大模型一个接一个的&#xff0c;而且各个都说自己的性能非常厉害&#xff0c;但是对于我们这些使用者&#xff0c;用起来就比较尴尬了。因为一个模型一个调用的方式&#xff0c;先得下载模型&#xff0c;下完模型&#xff0c;写加载代码&#xff0c;麻烦得很。 对于程…

新火种AI|GPT-4诞生1年,OpenAI把它放到了机器人上

作者&#xff1a;一号 编辑&#xff1a;美美 ChatGPT拥有了身体&#xff0c;机器人也有了灵魂。 从OpenAI在去年3月14日拿出GPT-4后&#xff0c;已经过了整整一年。显然&#xff0c;在GPT-4诞生之后的这一年&#xff0c;一切都迭代得太快了&#xff0c;从GPT-4展现多模态能力&…

计算机组成原理-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计算机组成原理中的各章练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门&#xff1a; 第一/二章 概述和数…

2024.3.14 C++

思维导图 封装类 用其成员函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;加法&#xff09;&#xff0c;并封装一个全局函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;减法&#xff09;。 #include <iostream>using nam…

GPT-SoVITS开源音色克隆框架的训练与调试

GPT-SoVITS开源框架的报错与调试 遇到的问题解决办法 GPT-SoVITS是一款创新的跨语言音色克隆工具&#xff0c;同时也是一个非常棒的少样本中文声音克隆项目。 它是是一个开源的TTS项目&#xff0c;只需要1分钟的音频文件就可以克隆声音&#xff0c;支持将汉语、英语、日语三种…

【PyQT】大地线长度计算工具实现

本设计实现了一个大地线长度计算工具&#xff0c;用户可以输入两个点的经纬度坐标&#xff0c;然后点击计算按钮&#xff0c;程序会根据输入的经纬度坐标计算出这两个点之间的大地线长度&#xff0c;并将结果显示在界面上。如下图所示。 附录完整代码如下&#xff1a; # 导入所…

L1-5 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如果没有…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句&#xff08;两种&#xff09; 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

MapReduce解析:从定义到核心思想,编程规范与序列化解读

目录 一、 MapReduce1.1 MapReduce定义1.2 MapReduce优缺点1.2.1 优点1.2.2 缺点 1.3 MapReduce核心思想1.4 MapReduce进程1.5 常用数据序列化类型1.6 MapReduce编程规范1.6.1Mapper阶段1.6.2 Reduce阶段1.6.3 Driver阶段 1.7 WordCount案例实操1.7.1 本地测试1.7.2 提交到集群…