文章目录
- 1.版本回退
- 1.1 没有commit的情况
- 1.2 已经commit但没有push的情况
- 1.3 已经push到远端仓库的情况
- 2. 删除文件
- 2.1 从工作区删除文件
- 2.2 使用git rm命令删除文件
- 2.3 永久删除文件
- 2.4 永久删除文件的步骤拆解
- 3. 查看指定文件的修改
- 3.1 查看文件的所有commit
- 3.2 查看所有commit的修改内容
- 3.3 查看某个commit里的修改
- 3.4 查看本地修改的差异
- 3.5 与某个commit做比较
- 3.6 两个commit之间的差异
- 4. 多个客户端之间的同步
- 4.1 本地化方式
- 4.2 中心化方式
1.版本回退
1.1 没有commit的情况
如果你还没有进行 commit,那么可以通过git checkout
或者git restore
命令来回退。
例如,如果你想撤销对 file1.txt 的更改,可以使用以下命令:
git checkout -- file1.txt
或者使用git restore
命令:
git restore file1.txt
如果你想撤销对所有文件的更改,可以使用:
git checkout -- .
或者:
git restore .
1.2 已经commit但没有push的情况
如果你已经进行了 commit,但还没有 push,那么可以通过git reset
或git revert
命令来回退。
使用git reset
命令回退到上一个 commit:
git reset HEAD~1
这将把 HEAD 指针移动到上一个 commit,并将更改放回到工作目录。你可以使用--soft
、--mixed
或--hard
选项来指定回退方式。默认情况下,git reset
使用--mixed
模式。
使用git revert
创建一个新的 commit,以撤销指定的 commit:
git revert HEAD
这将创建一个新的 commit,以撤销最近的 commit。你也可以使用 commit 的哈希值或者其他引用来指定要撤销的 commit。
1.3 已经push到远端仓库的情况
如果你已经进行了 push,那么回退的过程将涉及到远程仓库。首先,你需要使用git reset
或git revert
进行本地回退,然后再强制推送到远程仓库。
使用git reset
回退到上一个 commit 并强制推送:
git reset HEAD~1
git push -f origin <branch_name>
使用git revert
创建一个新的 commit,以撤销指定的 commit,并推送:
git revert HEAD
git push origin <branch_name>
需要注意的是,强制推送可能会导致其他人在远程仓库中丢失提交,所以在团队协作中要慎重使用。
2. 删除文件
2.1 从工作区删除文件
- 首先,在工作区删除文件。例如,在命令行中,输入以下命令:
将“文件名.txt”替换为要删除的文件名。rm 文件名.txt
- 然后,将删除操作添加到暂存区(staging area):
同样,将“文件名.txt”替换为要删除的文件名。git add 文件名.txt
- 提交更改:
将“删除了文件名.txt”替换为适当的提交信息。git commit -m "删除了文件名.txt"
2.2 使用git rm命令删除文件
-
使用
git rm
命令删除文件。例如,输入以下命令:git rm 文件名.txt
将“文件名.txt”替换为要删除的文件名。
这将从工作区和暂存区中删除文件。
-
提交更改:
git commit -m "删除了文件名.txt"
将“删除了文件名.txt”替换为适当的提交信息。
在这两种方法中,使用git rm命令更简单,因为它直接从工作区和暂存区中删除文件,无需手动执行git add命令。注意,在删除文件后,确保提交更改,以便将更改更新到版本历史中。
2.3 永久删除文件
我们有的时候可能会不小心上传了一些无用的文件,尤其是我们使用C和C++的开发者,一不小心上传很多编译的中间文件,当然这个操作是可以通过.gitignore来避免的。但还是有的时候可能是上传了一个秘钥文件,这样关键的东西一般是很保密的,一般开发人员不应该能看到这样的秘钥文件。已经commit且push到远程仓库了,该怎么把它给删除呢?而且记录里也不应该存在,比如我们要永久删除secret.cert:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch secret.cert' --prune-empty --tag-name-filter cat -- --all
git push origin master --force
也可以删除文件夹,只需要将secret.cert替换成文件夹,在rm后添加-r
参数
2.4 永久删除文件的步骤拆解
-
使用
git log
查找要删除文件的提交哈希(commit hash):git log --pretty=oneline -- 文件名.txt
将“文件名.txt”替换为要删除的文件名。从输出中找到最早的提交哈希。
-
使用
git rebase
命令交互式地删除该文件:git rebase -i 提交哈希^
将“提交哈希”替换为步骤1中找到的哈希值。注意,后面要加上脱字符(^),表示哈希的前一个提交。
这将打开一个文本编辑器,显示要编辑的提交列表。
-
在文本编辑器中,找到要删除文件的那一行,将该行开头的
pick
更改为edit
,然后保存并关闭文件。 -
现在,你位于要删除文件的提交状态。从此提交中删除文件:
git rm --cached 文件名.txt
将“文件名.txt”替换为要删除的文件名。
-
使用
git commit --amend
命令重新提交更改:git commit --amend
这将重新提交该更改,并删除文件。
-
使用
git rebase --continue
继续重写剩余的历史记录:git rebase --continue
-
最后,将更改推送到远程仓库:
git push --force
注意,使用
--force
选项会覆盖远程仓库的历史记录。这可能会影响其他团队成员,因此在执行此操作之前,请确保与团队成员进行沟通。
经过上述步骤,文件将被永久删除,并且Git历史中不再包含有关该文件的记录。但是,这种操作具有一定风险,请谨慎操作。
3. 查看指定文件的修改
3.1 查看文件的所有commit
git log --oneline [filename]
显示文件的所有修改记录
3.2 查看所有commit的修改内容
git log -p [filename]
显示所有commit的修改
3.3 查看某个commit里的修改
git show [commit_id] [filename]
显示某个commit里文件的修改
3.4 查看本地修改的差异
git diff [filename]
查看本地对某个文件做了哪些具体的修改
3.5 与某个commit做比较
git diff [commit_id] [filename]
显示与某个commit间所有的差异,commit-id可以替换成HEAD,比如HEAD~2
3.6 两个commit之间的差异
git diff [commit_id1] [commit_id2]
显示两个commit所有差异
4. 多个客户端之间的同步
4.1 本地化方式
如果我们期望同事之间去互相pull和push代码,可以使用如下方式:
-
在每个参与者的电脑上,找到本地Git仓库的文件夹。在该文件夹中,执行以下命令,以启动一个Git服务:
git daemon --reuseaddr --base-path=. --export-all --verbose
这个命令将启动一个Git服务,允许其他参与者访问本地仓库。
-
获取每个参与者的IP地址,确保它们位于同一个局域网或VPN环境下。
-
在每个参与者的电脑上,将其他参与者的仓库添加为远程仓库。例如,假设同事A的IP地址是192.168.1.2,那么在同事B的电脑上,执行以下命令:
git remote add colleagueA git://192.168.1.2/项目文件夹名称
这将同事A的仓库添加为远程仓库。请根据实际情况替换IP地址和项目文件夹名称。
-
当需要从其他同事处获取代码更新时,使用以下命令:
git fetch colleagueA 分支名称 git merge colleagueA/分支名称
这两个命令将从同事A的仓库获取更新,并合并到当前分支。请根据实际情况替换分支名称。
-
当需要将代码推送给其他同事时,首先确保对方已经将你的仓库添加为远程仓库。然后,使用以下命令:
git push colleagueA 分支名称
这个命令将把你的分支推送到同事A的仓库。请根据实际情况替换分支名称。
注意:这种方法需要每个参与者的电脑都运行Git服务,并且互相之间可以访问。如果出现网络问题,可能导致同步失败。而且这种方法没有中心化的服务器来管理版本历史,可能在协作过程中出现冲突。因此,推荐在实际应用中使用中心化的Git服务器来进行同步。
4.2 中心化方式
还通过一个中心化的Git服务器(如GitHub、GitLab等)作为中转站来实现。下面是一些基本步骤:
-
创建一个远程仓库:首先,你需要在一个Git服务器上创建一个远程仓库。这可以是GitHub、GitLab、Bitbucket等。创建远程仓库后,通常会得到一个URL,用于访问该仓库。
-
添加远程仓库:在本地仓库中,你需要将远程仓库添加为一个“远程”(remote)。在终端中输入以下命令:
git remote add origin 远程仓库的URL
这里的"origin"是远程仓库的别名,你可以根据需要更改。
-
推送本地仓库内容到远程仓库:使用以下命令将本地仓库的内容推送到远程仓库:
git push -u origin master
这会将本地的"master"分支推送到远程仓库的"master"分支。如果你使用的是其他分支,将"master"替换为相应的分支名。
-
其他客户端克隆远程仓库:在其他客户端上,你需要先克隆远程仓库。使用以下命令:
git clone 远程仓库的URL
这会将远程仓库克隆到本地,并自动设置"origin"远程。
-
拉取更新:当其他客户端对远程仓库进行了更改并推送后,你可以使用以下命令将最新更改拉取到本地:
git pull origin master
同样,如果使用的是其他分支,请将"master"替换为相应的分支名。