git 基本使用

0x00 基本介绍

仓库(Repository)

1
仓库就是你的项目

收藏(Star)

1
仓库主页star按钮,星星的数量为收藏的人数

复制克隆项目(Fork)

1
2
点击这个别人的项目就进入你的仓库了,你就可以在你的仓库二次开发,
对他原来的项目不影响,同理,别人也可以对你的项目进行二次开发

发起请求(Pull Request)

1
2
3
这个选项基于fork,如果你想把你的二次开发合并到原作者的项目中
那么你可以向原作者发起一个Pull Request请求,如果他同意了
你的二次开发就会更新到原作者的项目中

关注(Watch)

1
关注某个项目,如果这个项目有了任何更新,你都会第一时间收到关于这个项目的通知提醒

事物卡片(Issue)

1
发现项目的问题,进行讨论的地方

基本功能与命令


0x01 Git 使用

Git工作区域

Git Repositpry (Git 仓库)

1
最终确认的文件保存到仓库,成为一个新的版本,并且对他人可见

暂存区

1
暂存已经修改的文件最后统一提交到git仓库中

工作区 (Working Directory)

1
2
就是本地电脑中的目录
添加、编辑、修改文件等动作

Git初始化

基本信息设置

这一步会影响github仓库主页显示谁提交的该文件

1
2
3
4
5
6
# 设置用户名 
git config --global user.name 'xxx'
# 设置用户邮箱
git config --global user.email 'xxx@xxx.com'
# 查看设置
git config --list

在本地的一个目录初始化一个新的Git仓库

git init 会在当前目录创建一个.git文件夹
所有Git需要的数据和资源都存放在这个目录中

1
2
git init
git init <dirpath> # 指定一个目录作为Git仓库

向仓库中添加文件流程

可以用git status查看git工作区域的状态

先将文件从工作区添加到暂存区

1
2
git add test1.txt
git add test2.txt

将暂存区上传到git仓库中,生成版本

1
git commit -m "提交描述"

查看版本记录

1
git log

修改文件之后和添加文件的流程一样

如果修改了了很多文件,而不想每一个都add,想commit自动来提交本地修改,我们可以使用-a选项

1
git commit -a -m "提交描述"

从Git中删除文件

从Git中移除某个文件,就必须要从已跟踪文件清单中移除

1
git rm test1.txt

如果删除之前修改过并且已经放到暂存区的话,需要加上-f选项

1
git rm -r test1.txt

如果希望只把文件从暂存区移除,但仍然保持在当前工作目录中,使用--cached选项

1
git rm --cached test1.txt

git 回滚

回滚去之前的版本

1
2
git log # 查看版本号
git reset --hard 版本号 # 进行回滚操作

回滚去之后的版本

1
2
git reflog  # 查看本地的顺序提交日志
git reset --hard 版本号

0x02 git分支

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。

分支操作

查看分支

1
git branch

创建分支

1
git branch 分支名

切换分支

1
git checkout 分支名

合并分支(可能会产生冲突)

将指定的分支名合并到当前分支
产生冲突时就需要手动对文件中冲突的部分进行修改

1
git merge 分支名

删除分支

1
git branch -d 分支名

0x03 使用Git管理远程仓库

将远程仓库克隆到本地

1
2
3
4
git clone <repo>
git clone <repo> <directory>
# repo: Git仓库
# directory: 本地目录

将远程仓库中@关联的子文件递归地下载到本地

1
git clone --recursive <repo> <directory>

将本地仓库同步到git远程仓库中

1
2
3
# 给远程仓库起别名
git remote add <alias name> <repo>
git push -u <alias name> master

将git远程仓库同步到本地仓库中

1
2
3
4
5
6
7
8
9
10
git pull <alias name> <repo> 
# 等价于
git fetch <alias name> <repo>
git merge <alias name>/<repo>

# e.g.
git pull origin main
# 等价于
git fetch origin main
git merge origin/main

解决git pull [您对下列文件的本地修改将被合并操作覆盖]的错误
是否想要保存本地修改

  • yes

    1
    2
    3
    4
    5
    6
    7
    # 将当前修改保存本地快照
    git stash
    # 回滚到上一版本 拉去快照
    git reset --hard
    git pull origin main
    # 恢复快照
    git statsh pop
  • no
    直接将本地的状态恢复到上一个 commit id 。然后用远程的代码直接覆盖本地就好了。

    1
    2
    3
    # 直接回滚拉取就完事了
    git reset --hard
    git pull origin main

解决不同分支之间的合并某一个提交

1
2
3
4
5
6
7
8
9
# 切换到已经提交的分支,找到要合并的 commit id
git checkout <branch a>
git log --pretty=oneline
# 切换到需要合并的分支
git checkout <branch b>
# 把之前找到的commit id 同步到本地仓库
git cherry-pick <commit id>
git status
git push origin <branch b>

0x04 git base

base(变基):使git记录变得更加简洁

注意git rebase可能会产生冲突,手动解决后并根据git提示完成一些命令后在输入git rebase --continue,可完成日志的合并

将多个本地提交记录合成一个记录远程提交

1
2
3
4
# <num>数字 -- 找<num>条最近的提交进行合并日志提交
git rebase -i HEAD~<num>
# 或-- 找从HEAD到指定版本号中的记录合并日志提交
git rebase -i 版本号

注意:合并记录时不要和已经push到远程仓库的记录合并

解决远程仓库领先本地一个版本且本地仓库有一个新版本未提交

1
2
git fetch <alias name> <repo>
git rebase <alias name>/<repo>

其他

git配置文件

项目配置文件:项目/.git/config

1
2
git config --local user.name 'wakaka'
git config --local user.email 'wakaka@github.com'

全局配置文件:~/.gitconfig

1
2
git config --global user.name 'wakaka'
git config --global user.email 'wakaka@github.com'

系统配置文件:/etc/.gitconfig

1
2
3
# 注意:需要root权限
git config --system user.name 'wakaka'
git config --system user.email 'wakaka@github.com'

git配置代理

clone with ssh
~/.ssh/config 后添加下面两行

1
2
3
Host github.com

ProxyCommand socat - SOCKS:127.0.0.1:%h:%p,socksport=1088

clone with http

建议使用http, 因为socks5 在使用git-lfs时会报错proxyconnect tcp: dial tcp: lookup socks5: no such host

1
git config --global http.proxy http://127.0.0.1:1088

CTF中常用命令

查看每个commit修改了哪些文件

1
git log --stat

查看当前版本与想查看的commit之间的变化

1
git diff HEAD commit-id

回滚到上一版本(HEAD^表示上一版本,HEAD表示当前版本)

1
git reset --hard HEAD^