序
2023/02/09 晚
鉴于本篇文章收藏量比较多,那就给大家分享点在实际工作中使用频率最高的工作流命令吧。
场景如下(多人共同开发一个项目):我叫小明,参与了一个名为 chatGPT 的项目,这个 AI 最近很火,就以此作为例子吧。我们组有 4 个同事共同开发这个项目 develop_chatgpt ,这个项目中有一些文件或目录是我们 4 个各自独立负责的,也有几个文件我们 4 个人都需要负责。于是组长新建了一个 git 仓库, 为我们 4 个人各自新建了一个分支,我的分支名称就叫 develop_xiao.ming(个人分支),项目分支名称叫 develop_chatgpt ,现在就开始了我们 4 个人往 develop_chatgpt 这个分支中贡献自己的代码的快乐之旅了。
1. git clone <把仓库地址复制到这儿>
2. git branch -a /*先看下当前在哪个分支(一般克隆后都在master分支),顺便复制一下要去的分支*/
3. git checkout <自己要去的分支名称,比如组长分配的分支是 develop_xiao.ming >
4. git branch /*再确认一下确实已经在自己的分支了*/
5. git pull origin <develop_chatgpt> /*从项目分支拉取最新的代码到个人分支,然后再进行修改,保证每次修改都是修改的最新代码*/
5. 修改代码
6. git status /*看看自己修改了哪些文件*/
7. git add <修改了的文件名称>
8. git commit -m "任务号 注释说明"
9. git push origin <组长给分配的分支比如是 develop_xiao.ming>
10. 然后在网页上从 develop_xiao.ming 往 develop_chatgpt 提交一个合并请求。
11. 在开发的群中给组长发消息说,我做了什么修改,并且提交了一个合并请求,请审查,然后代码没有问题,组长就会把修改的代码合并到 develop_chatgpt 分支中去了。
到此一个完整的工作流就结束啦~
为什么提交了合并请求后需要向组长发消息呢,为了让组长尽快合并代码,方便其他同事修改代码的时候可以拉取到最新的代码;因为这个项目是我们 4 个人共同开发的,试想一下 4 个人共同修改一个文件,每个人在修改代码前都需要去 git pull 拉取最新的代码,如果不去拉取最新的代码,那就相当于自己一个人在自己的分支玩儿,别人都已经合并了好几次代码了,你还是在好久之前的代码基础上修改,等你想提交合并请求时,会出现合并冲突问题。这些大家慢慢会有体会的。
最后感谢大家的支持。
2024/6/9 更新
问题1:当我(已经git push)提交完代码后,发现提交的不正确,需要撤回提交。
1、git log //查看提交记录
2、git reset HEAD^ //撤回最近的一次提交
3、git log //查看确认一下确实撤回成功了
4、git push origin develop_xiao.ming --force //将撤回的操作(强制)推送到远程仓库
问题2:代码已经 git push,提交合并请求后组长觉得我的 commit 信息写的不完善。我只要修改 commit 的信息。(严重警告!:当代码已经合并到了项目分支后,千万不要使用该方法)
操作过程:https://www.cnblogs.com/bella99/p/15766188.html
1.git rebase -i HEAD~1 (1代表倒数第一次的commit)
2.按i进入编辑模式,将pick修改为edit,按esc退出编辑模式,输入:wq保存并退出
3.git commit --amend (修改注释) 按i进入编辑模式,修改注释内容,esc退出编辑模式,输入:wq保存并退出
4.git rebase --continue (确认变基)
5.git push --force origin 分支名称 (强制push)
一、安装配置Git
1. 注册 GitHub 账号,GitHub:GitHub: Where the world builds software · GitHub。
2. 在 Linux 中安装 git,并生成授信证书。
开发者向 Git 版本库写入最常用到的协议是SSH协议,因为SSH协议使用公钥认证,可以实现无口令访问,而若使用HTTPS协议每次身份认证时都需要提供口令,即要输入GitHub 的账号和密码。
//第一步:安装git
[root@localhost ~]# yum install git
//第二步:获取ssh密钥,邮箱是注册github时使用的邮箱。(这里的邮箱跟刚才git官网上注册的一致)
[root@localhost ~]# ssh-keygen -t rsa -C "xxxxxx@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //输入保存key的文件名,这个随便写,可以写了keyfilename,不写按回车键它会默认创建在 '/root/.ssh' 下。
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): //输入密码,就是你每次提交项目代码时必须要输入密码,不想设置的话,直接按回车到下一步。
Enter same passphrase again: //再次确认密码。
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:07gnUfb1vX9w9XcU6YZf67x+27usXahJossmu4zwdgS xxxxxx@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| .|
| o |
| o + .|
| E = . o +=|
| . S . . o.B|
| . + .+*|
| . . o o . +++|
| o.oo..+ o ooo*|
| .o.+=+. o.oOX|
+----[SHA256]-----+
[root@localhost ~]# //到这里就成功啦~
[root@localhost ~]# git version //验证一下是否安装成功。
git version 1.8.3.1
[root@localhost ~]# cd /root/.ssh/
[root@localhost .ssh]# ls
id_rsa id_rsa.pub
//可以看到生成了一个私钥(id_rsa)和公钥(id_rsa.pub)
[root@localhost .ssh]# vi id_rsa.pub //打开公钥文件进行复制。
3. 建立和 GitHub 的联系。将 Git 证书配置到 GitHub上,保证 Linux 服务器和 GitHub 之间可以连通。
打开 id_rsa.pub 文件,将里面的所有字符 全部复制 出来,粘贴到如下图所示的地方。
点击 github 网页右上角的用户头像->settings->SSH and GPG keys->New SSH key
应用场景:需要注意的是,github允许添加多个SSH Keys,假定我们有自己的笔记本和实验室/办公室的电脑,需要将每台电脑的key添加到github,然后可以使用每台电脑往github推送了。
4. 验证是否配置成功。
在 Linux 中执行此命令:ssh git@github.com
看到 You've successfully authenticated,表示配置成功!
//最后一步验证是否配置成功。
[root@localhost .ssh]# ssh git@github.com //执行此命令
The authenticity of host 'github.com (20.205.243.166)' can't be established.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi Username! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
[root@localhost .ssh]#
5. 连接成功后,需要绑定用户。
如果让当前电脑的所有git操作均使用同一个git账户,该配置只需要做一次之后Linux主机上所有git管理项目生效::
git config --global user.name "xxxxx"
git config --global user.email "xxx@xxx"
主要注意一个问题,因为git是分布式版本控制系统,所以首次安装的时候都会让机器自报家门,(邮箱+名字)这里的邮箱和名字需要你在github官网(www.github.com)上注册你账号信息,为什么要这样做呢?因为你的代码是要联机上传到github代码托管平台上去的,联机操作下文会详说。(当然,如果你不打算联机操作,那么这个邮箱+名字,你可以随意)。
如果想为每个项目单独配置不同的git用户,在每个项目的主目录下执行:
git config user.name "xxxxx"
git config user.email "xxx@xxx"
[root@localhost git_space]# git config --global user.name "******"
[root@localhost git_space]# git config --global user.email "********@***.com"
ps :git config –global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
二、使用 Git 提交项目文件
分两小节,内容概要:
1. 从本地新建项目,提交上传至 GitHub 。
- 如果你有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,那么首先需要进入该项目目录中。将尚未进行版本控制的本地目录转换为 Git 仓库;即执行 git init 初始化命令。
$ git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
2. 从 GitHub 上 Clone一个仓库,修改并上传至原仓库。比如说项目组长已经给你创建好仓库和你的分支了,然后你需要提交代码了,这时候就需要克隆了。
如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用到 git clone
命令。 如果你对其它的 VCS 系统(比如说 Subversion)很熟悉,请留心一下你所使用的命令是"clone"而不是"checkout"。 这是 Git 区别于其它版本控制系统的一个重要特性,Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone
命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库 (虽然可能会丢失某些服务器端的钩子(hook)设置,但是所有版本的数据仍在,详见 在服务器上搭建 Git )。
克隆仓库的命令是 git clone <url>
。 比如,要克隆 Git 的链接库 libgit2
,可以用下面的命令:
$ git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git
文件夹, 从远程仓库拉取下所有数据放入 .git
文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2
文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。
如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:
$ git clone https://github.com/libgit2/libgit2 mylibgit
这会执行与上一条命令相同的操作,但目标目录名变为了 mylibgit
。
复制自:Git - 获取 Git 仓库 (git-scm.com)
2.1 从本地新建项目,提交上传至 GitHub 。
(1) 在 Linux 本地中新建一个工作目录,作为远程目录的本地副本。
//步骤
[root@localhost ~]# mkdir git_space
[root@localhost ~]# cd git_space/
[root@localhost git_space]# git init //把这个目录变成 Git可以管理的仓库
Initialized empty Git repository in /root/git_space/.git/
[root@localhost git_space]# cp ../workspace/callback_example_2/ ./ -r //将自己写的项目文件复制到本地 git 副本目录下。
[root@localhost git_space]# ls
callback_example_2
[root@localhost git_space]# git add callback_example_2 //git add 后可以跟单个文件、目录。
[root@localhost git_space]# git status //查看当前工作区的状态(需提交的变更文件)。
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: callback_example_2/bin/Makefile
# new file: callback_example_2/bin/Makefile_bak
# new file: callback_example_2/bin/main.c
# new file: callback_example_2/bin/notice_wake_app.1.0.0.1
# new file: callback_example_2/include/libnotice_wake.h
# new file: callback_example_2/lib/libnotice_wake.so
# new file: callback_example_2/src/Makefile
# new file: callback_example_2/src/libnotice_wake.c
# new file: callback_example_2/src/libnotice_wake.h
#
//提交到本地git仓库
[root@localhost git_space]# git commit -m "新建项目"
[master (root-commit) d5cddc1] 新建项目
Committer: root <root@localhost.localdomain>
9 files changed, 221 insertions(+)
create mode 100644 callback_example_2/bin/Makefile
create mode 100644 callback_example_2/bin/Makefile_bak
create mode 100644 callback_example_2/bin/main.c
create mode 100755 callback_example_2/bin/notice_wake_app.1.0.0.1
create mode 100644 callback_example_2/include/libnotice_wake.h
create mode 100755 callback_example_2/lib/libnotice_wake.so
create mode 100644 callback_example_2/src/Makefile
create mode 100644 callback_example_2/src/libnotice_wake.c
create mode 100644 callback_example_2/src/libnotice_wake.h
[root@localhost git_space]#
(2) 在 GitHub 中创建远程仓库。
首先新建一个仓库。
仓库地址使用 SSH 协议,如果用https地址每次push/pull都要输入github账号密码。
创建远程仓库成功后界面如下:
将上图的命令复制下执行。
关联到远程仓库。
//关联远程仓库
[root@localhost git_space]# git remote add origin git@github.com:******/studyspace.git
//将本地库内容推送到远程仓库
[root@localhost git_space]# git push -u origin master
Counting objects: 15, done.
Delta compression using up to 3 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (15/15), 10.57 KiB | 0 bytes/s, done.
Total 15 (delta 0), reused 0 (delta 0)
To git@github.com:******/studyspace.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[root@localhost git_space]#
使用 SSH 协议,我在 push 过程中就没有输任何账号和密码。
此时 你在刷新你github上的项目就可以看到文件已经上传了。
至此,从零完成了从本地新建项目提交至 GitHub。
为啥添加过程不能用一条git commit命令来完成呢,这儿涉及一个工作区和暂存区的概念。工作区是电脑能看到的目录,比如learngit文件夹是一个工作区(如下图左所示)。在learngit文件夹有个隐藏目录.git,不属于工作区,而是git的版本库,版本库中重要的两部分是暂存区(下图中),和创建的第一个分区master(下图右)。
2.2 从 github 上 clone一个仓库,修改并上传至原仓库。
如果从零开发,最好的方式是先创建远程库(和前面创建远程库的操作一样),然后从远程库克隆。
第一步我们在 Linux 本地创建一个目录,比叫目录名叫 “git_study”。
- 从 github上 clone 代码
我们在 git_study 目录下执行:git clone git@github.com:用户名/项目名.git 命令。
可能会报如下错误:意思是说你克隆了一个空的仓库。
[root@localhost git_study]# git clone git@github.com:用户名/项目名.git
Cloning into 'packet_process'...
warning: You appear to have cloned an empty repository.
[root@localhost git_study]# ls
项目名
[root@localhost git_study]#
需要说明的是,我们先创建远程库(该远程库是空的,没有任何文件),然后直接在 Linux 上克隆该远程库后,不需要再执行该工作区目录的初始化命令 git init 和 关联远程库的命令的:git remote add origin git@github.com:******/studyspace.git ,然后我们就可以直接执行git add,git commit,git push 等命令了。
实际上,git clone 命令在执行时,已经将该项目目录和 GitHub 上的远程仓库建立了关联。
现在我们要在 Linux 本地写代码了,写完了,我们要提交到 GitHub 的仓库上。
- 先将我们新写的代码文件添加到本地暂存区。
git add 文件名 #表示将文件加入本地暂存区
或
git add . #表示将当前文件夹下所有文件添加至暂存区
- 确认提交更改。
git commit -m "提交的更改说明"
- 将本地库内容推送到远程仓库github。输入下述命令,输入命令之后,按照提示输入github的用户名和密码即可。
git push origion "分支用户名" //将本地主分支推到支远程主分。
如果想撤回add或commit,参考链接1 参考链接2
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并覆盖本地文件:
git fetch origin
git reset --hard origin/master
常见场景:
准备工作:我们先创建一个文件 main.c。
[root@localhost packet_process]# ls
main.c README
[root@localhost packet_process]# cat main.c
#include <stdio.h>
int main()
{
printf("hello word! \n");
return 0;
}
[root@localhost packet_process]#
0 . 如果想要删除某个文件
git rm filename (同时会删除本地文件)
1. 从暂存区撤离将要提交的文件
给定一个这样的场景,你讲一个文件修改完毕后,将它添加到暂存区,以便将来提交,但是你突然觉得还有东西没有改好,那只能把文件从暂存区撤回。
git reset HEAD 文件名 //将暂存区的文件撤回
-----------------------------------------------------------详细说明-------------------------------------------------------------
1. git add 添加 多余文件
这样的错误是由于, 有的时候 可能git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件
git add 如果添加了错误的文件的话
撤销操作
git status 先看一下add 中的文件
git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了
git reset HEAD XXX/XXX/XXX.c 就是对某个文件进行撤销了
实践环节 :
[root@localhost packet_process]# git status //先看下有啥变更,说有一个未追踪的文件main.c。需要使用 git add 去追踪它。
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# main.c
nothing added to commit but untracked files present (use "git add" to track)
[root@localhost packet_process]#
[root@localhost packet_process]# git add main.c //git add 将 main.c 添加到暂存区。
[root@localhost packet_process]# git status //再看一下状态有啥变化,提示有一个新文件。
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: main.c
#
[root@localhost packet_process]# git reset HEAD main.c //从暂存区中撤销出来。
[root@localhost packet_process]# git status //再看下状态,和未添加到暂存区时的状态一样了。
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# main.c
nothing added to commit but untracked files present (use "git add" to track)
[root@localhost packet_process]#
2. git commit 错误,没有 push 时。
如果不小心 弄错了 git add后 , 又 git commit 了。
先使用
git log 查看节点
commit xxxxxxxxxxxxxxxxxxxxxxxxxx
Merge:
Author:
Date:
然后 git reset commit_id (回退到上一个 提交的节点 代码还是原来你修改了的)。
直接查看该链接,讲的很好:git如何撤销commit的方法(未push)_相关技巧_脚本之家 (jb51.net)
说明:还没有 push 的时候
- git reset commit_id (回退到上一个 提交的节点 代码还是原来你修改的)。
- git reset –hard commit_id (回退到上一个commit节点, 代码也发生了改变,变成上一次的)。
-
git reset 命令分为两种: git reset –-soft 与 git reset –-hard ,区别是:
前者表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。后者直接回改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码。--soft选项的意思是,保留当前工作区,以便于我们修改完之后重新提交。如果采用--hard,那么会还原到对应的版本,我们就不能达成“撤销提交,修改一点点之后重新提交并推送”的目的了。
3.如果要是 提交了以后,可以使用 git revert
当然,我们一般的使用时,如果已经push了,使用revert,如果没有,就是用reset。(25条消息) git reset 和 revert 的区别_Ardor-Zhang的博客-CSDN博客_git reset revert区别
还原已经提交的修改
此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。
git revert HEAD //撤销前一次 commit
git revert HEAD^ //撤销前前一次 commit,^代表上一个的意思,HEAD^^代表上两个;HEAD~100代表上100个版本,
git revert commit-id //(撤销指定的版本,撤销也会作为一次提交进行保存)
git revert 是提交一个新的版本,将需要 revert 的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。
复制来源:(25条消息) git add , git commit 添加错文件 撤销_空白的泡的博客-CSDN博客_git撤销add的文件
1. 以下载 cJSON 开源项目为例。
复制下图红色方框的内容: git@github.com:DaveGamble/cJSON.git
[root@localhost git_space]# git clone git@github.com:DaveGamble/cJSON.git
Cloning into 'cJSON'...
remote: Enumerating objects: 4545, done.
remote: Counting objects: 100% (59/59), done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 4545 (delta 29), reused 30 (delta 14), pack-reused 4486
Receiving objects: 100% (4545/4545), 2.50 MiB | 886.00 KiB/s, done.
Resolving deltas: 100% (3014/3014), done.
[root@localhost git_space]# ls
callback_example_2 cJSON
[root@localhost git_space]# cd c
callback_example_2/ cJSON/
[root@localhost git_space]# cd cJSON/
[root@localhost cJSON]# ls
appveyor.yml cJSON.c cJSON_Utils.c CMakeLists.txt fuzzing LICENSE README.md tests
CHANGELOG.md cJSON.h cJSON_Utils.h CONTRIBUTORS.md library_config Makefile test.c valgrind.supp
[root@localhost cJSON]#
问题:
如果没有配置 git 的用户信息,直接去 commit 会有如下提示信息,此时我们用下列两个命令配置就好了。
git config --global user.name "Your Name"
git config --global user.email you@example.com
[root@localhost git_space]# git commit -m "新建项目"
[master (root-commit) d5cddc1] 新建项目
Committer: root <root@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
//以上内容的翻译:
提交者:root <root@localhost.localdomain>
您的姓名和电子邮件地址是根据自动配置的
在您的用户名和主机名上。 请检查它们是否准确。
您可以通过明确地设置来确定此信息:
git config --global user.name "你的名字"
git config --global user.email you@example.com
完成此操作后,您可以通过以下方式修复用于此提交的身份:
git commit --amend --reset-author
参考资料:
3. Git 中文手册。Git Community Book 中文版http://gitbook.liuhui998.com
4. 基本命令,可查。Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)https://www.liaoxuefeng.com/wiki/896043488029600 5. git命令,可查。Github 简明教程 | 菜鸟教程 (runoob.com)
https://www.runoob.com/w3cnote/git-guide.html
6. git 指南,可查手册。Git - 获取 Git 仓库 (git-scm.com)https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%8E%B7%E5%8F%96-Git-%E4%BB%93%E5%BA%93
Git 优秀教程推荐
1.git - the simple guide - no deep shit! (rogerdudler.github.io) [图形化模式,简单易懂]
2.图解Git (marklodato.github.io) [一样是图形化教程]
4.521xueweihan/git-tips: Git的奇技淫巧 (github.com) [制作的思维导图非常棒]
5.一个小时学会Git - 张果 - 博客园 (cnblogs.com)
优秀教程参考:Git 详细安装教程(详解 Git 安装过程的每一个步骤)_mukes的博客-CSDN博客_git安装
END......