Git 基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
本章将对有关创建与提交你的项目快照的命令作介绍。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明:
-
workspace:工作区
-
staging area:暂存区/缓存区
-
local repository:版本库或本地仓库
-
remote repository:远程仓库
一个简单的操作步骤:
$ git init $ git add . $ git commit
-
git init - 初始化仓库。
-
git add . - 添加文件到暂存区。
-
git commit - 将暂存区内容添加到仓库中。
创建仓库命令
下表列出了 git 创建仓库的命令:
命令 | 说明 |
git init | 初始化仓库 |
git clone | 拷贝一份远程仓库,也就是下载一个项目。 |
提交与修改
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
下表列出了有关创建与提交你的项目的快照的命令:
命令 | 说明 |
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本。 |
git rm | 将文件从暂存区和工作区中删除。 |
git mv | 移动或重命名工作区文件。 |
提交日志
命令 | 说明 |
git log | 查看历史提交记录 |
git blame <file> | 以列表形式查看指定文件的历史修改记录 |
远程操作
命令 | 说明 |
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
https 和 SSH 的区别:
1、前者可以随意克隆github上的项目,而不管是谁的;而后者则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加 SSH key ,否则无法克隆。
2、https url 在push的时候是需要验证用户名和密码的;而 SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。
在 github 上添加 SSH key 的步骤:
1、首先需要检查你电脑是否已经有 SSH key
运行 git Bash 客户端,输入如下代码:
$ cd ~/.ssh $ ls
这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3。
2、创建一个 SSH key
$ ssh-keygen -t rsa -C "your_email@example.com"
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。 -C 设置注释文字,比如邮箱。 -f 指定密钥文件存储文件名。
以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:
Generating public/private rsa key pair. # Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。
接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),
当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如:
Enter passphrase (empty for no passphrase): # Enter same passphrase again:
接下来,就会显示如下代码提示,如:
Your identification has been saved in /c/Users/you/.ssh/id_rsa. # Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub. # The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com
当你看到上面这段代码的收,那就说明,你的 SSH key 已经创建成功,你只需要添加到github的SSH key上就可以了。
3、添加你的 SSH key 到 github上面去
a、首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制,也可以用git命令复制该文件的内容,如:
$ pbcopy < ~/.ssh/id_rsa.pub
Window 使用 clip 命令复制,Mac 则使用 pbcopy 命令
b、登录你的github账号,从又上角的设置( Account Settings )进入,然后点击菜单栏的 SSH key 进入页面添加 SSH key。
c、点击 Add SSH key 按钮添加一个 SSH key 。把你复制的 SSH key 代码粘贴到 key 所对应的输入框中,记得 SSH key 代码的前后不要留有空格或者回车。当然,上面的 Title 所对应的输入框你也可以输入一个该 SSH key 显示在 github 上的一个别名。默认的会使用你的邮件名称。
4、测试一下该SSH key
在git Bash 中输入以下代码
$ ssh -T git@github.com
当你输入以上代码时,会有一段警告代码,如:
The authenticity of host 'github.com (207.97.227.239)' can't be established. # RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. # Are you sure you want to continue connecting (yes/no)?
这是正常的,你输入 yes 回车既可。如果你创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:
Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':
当然如果你密码输错了,会再要求你输入,知道对了为止。
注意:输入密码时如果输错一个字就会不正确,使用删除键是无法更正的。
密码正确后你会看到下面这段话,如:
Hi username! You've successfully authenticated, but GitHub does not # provide shell access.
如果用户名是正确的,你已经成功设置SSH密钥。如果你看到 “access denied” ,者表示拒绝访问,那么你就需要使用 https 去访问,而不是 SSH 。
git关联本地文件与远程仓库
步骤一:
在本地想放到github上的项目的根文件夹执行git init。
git init 命令用于在目录中创建新的 Git 仓库。 Git 创建仓库
在目录中执行 git init 就可以创建一个 Git 仓库了。
例如我们在当前目录下创建一个名为 runoob 的项目:
实例
$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/ # 初始化空 Git 仓库完毕。
现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。
.git 默认是隐藏的,可以用 ls -a 命令查看:
ls -a
. .. .git
步骤二:
在github上新建一个仓库Repository,得到仓库地址。比如https://github.xsky.com/li-cheng/git-test.git
步骤三:
本地项目根文件夹执行:
git clone origin https://github.xxxx.com/li-cheng/git-test.git
步骤四:
关联之后,就可以进行拉取远程代码和提交本地代码到远程等等操作啦 比如
git pull origin master
git add .
git commit -m 'first commit'
git push
撤销操作--仅变动本地的代码
取消文件的修改
git checkout fileName, 这个命令会从本地仓库里检出文件,覆盖掉 指定文件的修改。 本地仓库 即已经commit 提交到本地仓库的代码。把指定的文件名换成‘ . ’ 即为选择全部的意思。
取消 git add 操作
git reset --mixed 仅取消 git add 带来的效果。 即本地的修改还在,但是取消了add 的状态。
回退到指定到 commit号
git reset --hard commitId, 这个命令 回退到指定的commit,并且不会保留本地尚未提交的修改。所以一定要慎重使用。
git rebase命令
https://blog.csdn.net/weixin_42310154/article/details/119004977
git commit --amend 命令
在代码已经被commit时发现代码有问题需要修改,修改后再次提交,执行以下命令
-
git add (修改的文件)
-
git commit --amend -s (合并此次提交到同一个commit)
-
git push -f
git 拉取指定的远程分支(三种方式)
直接拉取
git clone -b ants git@github.com:Ants-double/CareerJava.git
git clone -b 远程分支名 仓库地址
本地已经有相关的仓库代码
//查看远程分支
//创建本地分支并关联
git checkout -b 本地分支 origin/远程分支
//已有本地分支创建关联
git branch --set-upstream-to origin/远程分支名 本地分支名
//拉取
git pull
http://t.zoukankan.com/sunlong88-p-8681363.html
https://blog.csdn.net/qq_23274715/article/details/112911355
场景:最后第二个commit为代码编写,最后一个commit为UT代码,现要修改最后第二个代码:
xxxx@172-10-30-61 algalon-gw % git add agw/src/main/java/com/xsky/agw/ipc/Server.java
xsky@172-10-30-61 algalon-gw % git commit -m"tem"
[server-muliplePorts-ut d5d5c9f] tem
1 file changed, 4 insertions(+), 10 deletions(-)
xsky@172-10-30-61 algalon-gw % git log
commit d5d5c9f6a895d92cfe72f167f81d03c22c3d6109 (HEAD -> server-muliplePorts-ut)
Author: li.cheng <li.cheng@xxxx.com>
Date: Wed Dec 7 16:58:26 2022 +0800
tem
commit 3e2fc2921343a7bbf4d5729861c02b4642d0af2f (licheng/server-muliplePorts)
Author: li.cheng <li.cheng@xxxx.com>
Date: Wed Dec 7 14:46:22 2022 +0800
test(conf perm rpc)modify the server supports listening on moltiple ports unit-test
Signed-off-by: li.cheng <li.cheng@xsky.com>
commit f0386060707b3e60f89dbf92b4832783ac5aa175
Author: li.cheng <li.cheng@xxxx.com>
Date: Tue Dec 6 17:11:12 2022 +0800
feat(conf ipc rpc)the Server supports listening on multiple ports
Signed-off-by: li.cheng <li.cheng@xxxx.com>
xxxx@172-10-30-61 algalon-gw % git rebase -i HEAD~3
将 tem移动到test上去,然后将pisk修改为s,保存退出
删除红色方框内的commit内容便可
场景:当你提交PR与master仓库冲突时(或者其他冲突时)需要rebase来解决冲突。
# 查看远程仓库
$ git remote -v
licheng git@github.xsky.com:li-cheng/algalon-gw.git (fetch)
licheng git@github.xsky.com:li-cheng/algalon-gw.git (push)
origin git@github.xsky.com:NAS/algalon-gw.git (fetch)
origin git@github.xsky.com:NAS/algalon-gw.git (push)
# 从远程获取代码库
$ git fetch origin
remote: Enumerating objects: 109, done.
remote: Counting objects: 100% (89/89), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 57 (delta 22), reused 36 (delta 10), pack-reused 0
Unpacking objects: 100% (57/57), 9.53 KiB | 263.00 KiB/s, done.
From github.xsky.com:NAS/algalon-gw
af2ae12..180dda8 master -> origin/master
* [new tag] XSCALEROS_6.1.100.0.221216 -> XSCALEROS_6.1.100.0.221216
# rebase 到远程master仓库
$ git rebase origin/master
# 查看状态
$ git status
interactive rebase in progress; onto 180dda8
Last command done (1 command done):
pick 2b94de4 feat(ipc rpc) Implement server without restart update/reload configuration file
No commands remaining.
You are currently rebasing branch 'reloadConf' on '180dda8'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --skip" to skip this patch)
(use "git rebase --abort" to check out the original branch)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: agw/src/main/java/com/xsky/agw/ipc/Server.java
modified: agw/src/main/java/com/xsky/agw/rpc/AdminRpcServer.java
# 冲突的文件
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: agw/src/main/java/com/xsky/agw/rpc/NameNodeRpcServer.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
agw-admin/agw-admin.iml
agw/agw.iml
agw/src/main/java/com/xsky/agw/.DS_Store
agw/src/test/java/com/xsky/agw/ipc/
algalon-gateway.iml
$ git rebase --continue
[detached HEAD 76969b8] feat(ipc rpc) Implement server without restart update/reload configuration file
3 files changed, 164 insertions(+), 34 deletions(-)
Successfully rebased and updated refs/heads/reloadConf.
# 在idea上修改后再次查看状态
$ git status
On branch reloadConf
Untracked files:
(use "git add <file>..." to include in what will be committed)
agw-admin/agw-admin.iml
agw/agw.iml
agw/src/main/java/com/xsky/agw/.DS_Store
agw/src/test/java/com/xsky/agw/ipc/
algalon-gateway.iml
nothing added to commit but untracked files present (use "git add" to track)
打tag标签:
$ git tag -a v2.3.0.1 -m 'release v2.3.0.1'
$ git push -f origin v2.3.0.1
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 158 bytes | 158.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 To github.xxxx.com:Tiger/hdfs.git * [new tag] v2.3.0.1 -> v2.3.0.1