SSH(Secure Shell)是一种用于安全地访问和管理远程计算机的网络协议。它通过加密的连接在不安全的网络上提供安全的通信方式。SSH常用于远程登录、远程命令执行以及安全数据传输。
当我们使用Git进行版本控制时,经常需要将代码推送到远程仓库(例如GitHub、GitLab、Bitbucket等)或者从远程仓库拉取代码。其中访问远程仓库使用的就是SSH
SSH的主要功能
- 远程登录:通过SSH客户端,你可以远程登录到另一台计算机,获取其终端会话。
- 远程命令执行:可以在远程计算机上执行命令,而无需直接登录到远程终端。
- 安全数据传输:使用SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol)在本地和远程计算机之间安全地传输文件。
- 端口转发:通过SSH隧道,可以将本地端口流量转发到远程服务器,或将远程端口流量转发到本地。
1、使用ssh连接远程服务器
服务器安装开启 SSH 服务
在 Ubuntu 上,你可以通过以下命令安装和启动 SSH 服务:
sudo apt update
sudo apt install openssh-server
sudo service ssh start
在 CentOS 上,可以使用:
sudo yum install openssh-server
sudo service ssh start
检查 SSH 服务是否正在运行:
service ssh status
# 成功会显示有 Active: active (running)
#
# service ssh restart 这个是重启的命令
获取服务器的 IP 地址
ifconfig
```
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.176.128 netmask 255.255.255.0 broadcast 192.168.176.255
inet6 fe80::fd92:f82d:65e0:3bda prefixlen 64 scopeid 0x20<link>
我的是 192.168.176.128
```
查找类似于 192.168.x.x
或 10.x.x.x
的地址,这将是虚拟机的 IP 地址。(如果是云服务器会是公网ip)
本地通过 ssh 连接远程服务器
打开 PowerShell 使用 ssh
命令连接到虚拟机。 例如:
ssh [email protected] -p 22
# -p 和 22 可以不写
# -p 指定端口, ssh默认是 22 端口, 如果你修改了端口, 那么 -p 需要指向你修改的端口
其中 username
是你在虚拟机上的用户名,192.168.x.x
是虚拟机的 IP 地址。
用户名就是 /home/
文件夹的文件夹名
示例
假设虚拟机的 IP 地址是 192.168.1.100
,你的虚拟机用户名是 user
,那么在 PowerShell 中你可以输入:
ssh [email protected] -p 22
然后输入虚拟机上的用户密码以完成登录。
注意事项
如果按照上面弄完本地无法通过ssh连接服务器
-
防火墙配置:确保服务器的防火墙允许 SSH 连接。你可以在虚拟机上使用以下命令开放 SSH 端口(通常是 22):
sudo ufw allow ssh
-
ssh配置:
# 编辑配置文件(默认是ssh配置文件不允许以root用户登陆) vim /etc/ssh/sshd_config # 在 sshd_config中添加如下内容 PermitRootLogin yes PasswordAuthentication yes # 上面两个内容分别是允许 ssh以 root 用户登陆 和 启用了密码认证
2、简化ssh登陆配置
可以通过创建 SSH 配置文件来简化连接过程,使得每次连接时不需要重复输入用户名和主机号。以下是如何配置 SSH 配置文件的步骤:
1、 编辑 SSH 配置文件
打开 PowerShell 或你的终端
编辑 SSH 配置文件。
配置文件通常位于 ~/.ssh/config
(在 Windows 上通常是 C:\Users\YourUsername\.ssh\config
)。如果文件不存在,你可以创建它。
vim ~/.ssh/config
# ~ 表示用户的根目录
添加 SSH 配置
在配置文件中添加类似以下的配置项:
Host myvm
HostName 192.168.1.100
User yourusername
Port 22
- Host: 这是你用来标识主机的别名。在这个例子中,我们用
myvm
作为别名。 - HostName: 这是实际的主机名或 IP 地址。
- User: 这是连接时使用的用户名。
- Port: 这是 SSH 连接使用的端口,默认为 22(可以省略,如果使用默认端口)。
保存并测试
ssh myvm
这样,你就可以使用你配置的别名(如 myvm
)来连接虚拟机,而不需要每次都输入用户名和主机号。
3、ssh 免密登陆配置
要实现 SSH 免密码登录,你需要配置 SSH 密钥认证。以下是详细步骤:
在本地生成 SSH 密钥对
打开 PowerShell 或终端。
生成 SSH 密钥对。运行以下命令,并按照提示操作:
ssh-keygen
# 运行这个命令会让你填很多选项,我可以一路回车,直接默认就行
将公钥复制到远程主机
将本地 C:\Users\YourUsername\.ssh\
中的 id_rsa.pub
的内容复制到服务器的 ~/.ssh/authorized_keys
文件中。( ~
表示服务器的用户的根目录,服务器如果没有.ssh 和 authorized_keys 文件的话可以自己创建 )
测试免密码登录
ssh user@remote_host
# 如果配置的有简化登陆的话 可以直接 ssh mymv
# mymv 是上面简化登录时候自己配置的名字
如果一切设置正确,你应该能够无需输入密码即可登录到远程主机。
4、scp
scp
(Secure Copy Protocol)是一个用于在本地和远程主机之间安全地复制文件和目录的命令行工具。它利用 SSH 协议来加密数据传输。
基本语法
scp [options] source destination
- source:要复制的源文件或目录。
- destination:目标位置,可以是本地或远程路径。
常用选项
-
-r
:递归复制整个目录。如果要复制目录及其内容,必须使用这个选项。scp -r localdir user@remotehost:/path/to/remote/dir
-
-P
:指定远程主机的端口号。注意,大写的-P
与小写的-p
不同,大写的-P
是用来指定端口的。scp -P 2222 localfile user@remotehost:/path/to/remote/file
1. user@remotehost
-
user
:这是远程主机的用户名。 -
remotehost
:这是远程主机的主机名或 IP 地址。
2. :/path/to/remote/file
-
冒号
:
:冒号分隔符用于区分用户名和主机地址与远程路径之间的界限。冒号后面的部分是文件在远程主机上的路径。 -
/path/to/remote/file
:这是远程主机上的文件或目录的绝对路径。-
绝对路径:以
/
开头,表示从根目录开始的完整路径。示例:
/home/alice/documents/file.txt
表示在远程主机的/home/alice/documents
目录下的file.txt
文件。 -
相对路径:如果路径没有以
/
开头,它是相对于远程用户的家目录(通常是~
)的路径。示例:
documents/file.txt
表示在远程主机的用户家目录下的documents
目录中的file.txt
文件。
-
文件传输的例子
-
从本地复制文件到远程主机:
scp localfile user@remotehost:/path/to/remote/file
- 这将把本地文件
localfile
复制到远程主机的/path/to/remote/
目录下,并重命名为file
。
- 这将把本地文件
-
从远程主机复制文件到本地:
scp user@remotehost:/path/to/remote/file localfile
- 这将把远程主机上的
/path/to/remote/file
文件复制到本地,并重命名为localfile
。
- 这将把远程主机上的
-
递归复制本地目录到远程主机:
scp -r localdir user@remotehost:/path/to/remote/dir
- 这将把本地目录
localdir
及其所有内容复制到远程主机的/path/to/remote/dir
目录下。
- 这将把本地目录
-
从远程主机递归复制目录到本地:
scp -r user@remotehost:/path/to/remote/dir localdir
- 这将把远程主机上的
/path/to/remote/dir
目录及其所有内容复制到本地的localdir
目录中。
- 这将把远程主机上的
使用场景
- 备份文件:可以用来将本地文件备份到远程服务器。
- 分发文件:将文件从一台计算机分发到多台计算机上。
- 跨平台文件传输:在不同操作系统之间传输文件,例如从 Windows 计算机到 Linux 服务器。
安全性
scp
使用 SSH 协议进行文件传输,因此提供了加密传输,确保数据在传输过程中不会被窥视或篡改。
总结
scp
是一个简单且安全的文件传输工具,适合基本的文件复制任务。它利用 SSH 协议进行加密传输,支持本地和远程之间的文件复制操作。
linux中我们常用到的是 tmux 和 vim, 这两个的配置文件在 用户的根目录下(/home/username
), 通过 ls -a
可以看到 .vimrc
和 .tmux.conf
的配置文件。我们可以通过 scp
命令快速的配置一个服务器的常用功能.
3、Git 概述
什么是Git
Git是一个分布式版本控制系统,用于跟踪文件的更改并协调不同用户之间的代码开发工作。它最初由Linus Torvalds于2005年为Linux内核开发设计。与集中式版本控制系统(如Subversion)不同,Git允许每个用户拥有自己的完整版本库副本,使得分布式开发和离线工作变得非常方便。
Git的核心概念及其关系
版本库(Repository)
- 本地版本库(Local Repository):存储在你自己的电脑上的Git版本库。
- 远程版本库(Remote Repository):存储在服务器上的版本库,可以通过网络访问,例如GitHub、GitLab等。
工作区(Working Directory)
- 工作区是你在电脑上查看和编辑文件的地方。
- 它包含了项目的所有文件和目录。
- 你在工作区中对文件所做的更改需要被添加到暂存区然后提交到版本库。
暂存区(Staging Area)
- 暂存区是一个临时存储区域,在这里你可以将所有将要提交的文件快照进行暂存。
- 通过使用
git add
命令,你可以将工作区中的更改添加到暂存区。 - 暂存区允许你分步提交文件的更改,而不是一次提交所有的更改。
提交(Commit)
- 提交是将暂存区中的内容永久性地保存到本地版本库的过程。
- 每次提交都会生成一个唯一的提交ID,用于标识该提交。
- 提交操作会记录更改的详细信息,如时间、作者、提交信息等。
分支(Branch)
- 分支是Git中独立的开发线,每个分支都有自己的提交历史。
- 默认的主分支通常叫
main
或master
。 - 通过创建分支,你可以在不影响其他分支的情况下进行开发,之后可以合并分支的更改。
远程仓库(Remote Repository)
- 远程仓库是托管在服务器上的版本库,用于团队协作和备份。
- 通过克隆、拉取和推送操作,本地仓库和远程仓库之间可以进行数据同步。
概念之间的关系
-
工作区与暂存区:工作区是你实际编辑文件的地方,而暂存区是一个临时区域,用于暂时保存即将提交的更改。通过
git add
命令将工作区的更改添加到暂存区。 -
暂存区与版本库:当你将更改添加到暂存区后,通过
git commit
命令将暂存区的内容永久性地保存到版本库中。 -
本地版本库与远程版本库:本地版本库是你在自己的电脑上工作的地方,远程版本库是托管在服务器上的版本库。通过
git push
和git pull
命令实现本地与远程版本库的同步。 -
分支与提交:分支是不同的开发线,每个分支有独立的提交历史。你可以在不同的分支上进行开发,然后将分支合并,以便整合不同的开发工作。
4、Git的常见用法
以下是Git的一些常见用法,包含如何初始化、克隆、提交、更改、分支操作和与远程仓库交互等。
1. 安装Git
在大多数Linux系统上,你可以通过包管理器安装Git:
sudo apt-get install git # Debian/Ubuntu
sudo yum install git # CentOS/RHEL
在macOS上,你可以使用Homebrew安装Git:
brew install git
在Windows上,你可以从Git官方网站下载并安装Git。
2. 初始化版本库
使用 git init
命令初始化一个新的Git版本库。
mkdir my_project
cd my_project
git init
3. 检查状态
使用 git status
命令查看工作区的当前状态。
git status
4. 添加文件到暂存区
使用git add
命令将文件添加到暂存区。
git add filename # 添加单个文件
git add . # 添加所有更改的文件
5. 提交更改
使用 git commit
命令提交暂存区的更改。
git commit -m "Commit message"
# 我们使用 commit 后会创建一个新的提交, 每个提交都有位移的hashId, 相当于是快照, 我们可以在不同的快照之间切换
6. 查看提交历史
使用 git log
命令查看提交历史。
git log
7. 回滚操作
git reset
是一个非常强大的命令,用于回滚提交和更改文件状态。它有三种主要模式:--soft
、--mixed
(默认)和 --hard
。以下是常用命令的简要介绍:
1. git reset --soft
- 只重置HEAD指针,不影响暂存区和工作区的文件。适用于希望保留更改但撤销提交的情况。
git reset --soft <commit_hash>
2. git reset --mixed
(默认)
- 重置HEAD指针和暂存区,但不影响工作区的文件。适用于希望保留更改但取消暂存的情况。
git reset --mixed <commit_hash>
# 或
git reset <commit_hash> # 默认使用 --mixed 模式
3. git reset --hard
- 重置HEAD指针、暂存区和工作区的文件。适用于希望完全回滚到指定提交并删除所有更改的情况。
git reset --hard <commit_hash>
git reflog
用于记录每次HEAD的移动情况,即使是回滚或重置的操作也会被记录。它在需要恢复误操作时非常有用。以下是常用命令的简要介绍:
1. 查看Reflog
- 显示HEAD的历史变动记录。
git reflog
2. 恢复到Reflog中的某个状态
- 使用reflog中的某个状态来恢复HEAD、暂存区和工作区。
git reset --hard <reflog_hash>
8、恢复和撤销操作
git restore
是一个用于恢复或取消更改的命令,它是Git 2.23引入的新命令,旨在简化并替代一些常见的恢复操作,如撤销工作区的更改或取消暂存的更改。以下是 git restore
的常用命令及其用法的简要介绍:
恢复工作区中的文件
如果你在工作区中修改了文件但尚未添加到暂存区,你可以使用 git restore
命令来撤销这些更改:
git restore <filename> # 恢复特定文件
git restore . # 恢复所有文件
这个命令会将工作区中的文件恢复到最近一次提交时的状态。
取消暂存的文件
如果你已经使用 git add
将文件添加到暂存区,但还没有提交,你可以使用 git restore --staged
命令来取消暂存:
git restore --staged <filename> # 取消暂存特定文件
git restore --staged . # 取消暂存所有文件
这个命令会将暂存区中的文件恢复到工作区的状态。
高级用法
1. 恢复到指定提交
你可以使用 --source
选项指定要恢复的源提交:
git restore --source=<commit_hash> <filename>
这个命令会将指定文件恢复到特定提交的状态。
2. 与其他选项结合使用
git restore
还有一些其他选项,可以进一步控制恢复操作:
--worktree
:只恢复工作区中的文件(这是默认行为)。--staged
:只恢复暂存区中的文件。-s
或--source
:指定源提交。
示例操作
假设你在项目中进行了一些更改,并使用 git restore
进行恢复:
恢复工作区中的更改
你修改了文件 file1.txt
,但不想保留这些更改:
git restore file1.txt
取消暂存的更改
你暂存了文件 file2.txt
,但还没有提交,现在想取消暂存:
git restore --staged file2.txt
恢复到指定提交
你想将 file3.txt
恢复到提交 abc1234
的状态:
git restore --source=abc1234 file3.txt
5、与远程仓库交互
把本地仓库上传到远程仓库 (云仓库), 可以让项目脱离本地, 可以让我们随时用不同的电脑获取并修改项目的内容
-
添加远程仓库:使用
git remote add
命令添加远程仓库。(这里需要注意, 下面的操作基本都是通过 ssh 跟远程仓库进行通信的, 像push pull 是通过 scp 实现的)git remote add origin https://github.com/user/repo.git # 我们一般用的都是 github 来创建一个项目当作远程仓库, 我们需要 执行上面讲的 "ssh中讲到的免密登陆配置" 类似的操作 # 在本地通过 ssh 生成一个私钥和公钥, 把公钥里的内容粘贴到 github setting 中的 ssh 添加一个 ssh key 中 # 这样就可以免密登陆远程仓库了 # origin:这是远程仓库的名称,通常默认用 origin 来指代主远程仓库。 # 当运行 git push 或 git pull 命令时,如果没有指定其他远程仓库,Git 会默认使用 origin。 # url 是 github 的仓库地址
-
推送到远程仓库:使用
git push
会将本地分支的提交推送到远程分支git push <remote> <branch>
-
<remote>
:远程存储库的名称,通常是origin。 -
<branch>
:要推送的本地分支的名称。
git push origin main # 推送到远程主分支 git push origin new_branch # 推送到远程新分支
-
-
拉取远程更改:git pull命令用于从远程存储库获取最新的更改,并将它们合并到本地分支。它相当于执行了git fetch和git merge两个操作。
git pull <remote> <branch>
-
<remote>
:远程存储库的名称,通常是origin。 -
<branch>
:要拉取的远程分支的名称。
git pull origin main
-
-
获取远程仓库信息:使用
git fetch
命令获取远程仓库的最新信息,但不进行合并。git fetch origin
-
克隆远程仓库:使用
git clone
命令从远程仓库克隆一个版本库到本地。git clone https://github.com/user/repo.git
6、不常用的操作
在Git中,分支的操作有时不如其他操作常用。当我们初始化一个Git仓库时,默认会创建一个名为master
(或在新版本中是main
)的分支。每次执行git commit
命令时,都会在当前分支上创建一个新的提交。
此外,我们可以在任何一个提交上创建一个新分支。这个新分支会包含当前提交的所有内容。当我们在新分支上进行提交操作时,这些提交记录会添加到新分支上,而不会影响原来的分支。
这种表达应该更加准确和清晰。如果你还有其他问题或需要进一步修改,请告诉我!
1. 创建和切换分支
使用 git branch
命令创建新分支,使用 git checkout
命令切换分支。
git branch new_branch # 创建新分支 new_branch 是新分支的 name
git checkout new_branch # 切换到新分支
或使用 git checkout -b
一次性完成分支的创建和切换。
git checkout -b new_branch
2. 上传分支
将本地分支推送到远程仓库。
git push origin your-branch-name
如果希望本地分支与远程分支关联,以便在将来进行拉取或推送时不需要指定远程分支名称,可以使用以下命令:
git push --set-upstream origin your-branch-name
3. 合并分支
使用 git merge
命令将分支合并到当前分支。
git checkout main # 切换到主分支
git merge new_branch # 合并new_branch到主分支
4. 解决合并冲突
合并过程中,如果有冲突,Git会标记冲突部分,用户需要手动解决冲突并提交解决后的更改。
# 编辑冲突文件,解决冲突后
git add conflicted_file
git commit -m "Resolved merge conflict"
5. 查看分支信息
使用 git branch
命令查看本地分支,使用 git branch -r
查看远程分支。
git branch # 查看本地分支
git branch -r # 查看远程分支
6. 删除分支
使用 git branch -d
命令删除本地分支。
git branch -d branch_name # 删除本地分支
使用 git push origin --delete
命令删除远程分支。
git push origin --delete branch_name # 删除远程分支
标签:万字超,文件,git,ssh,提交,远程,分支
From: https://blog.csdn.net/m0_74065705/article/details/140897830