git

摘要

1.配置 git 客户端

1.1 安装 git bash

https://git-scm.com/downloads

1.2 设置 ssh Key

查看是否有 ssh key

1
ls -al ~/.ssh

没有则生成 ssh key

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

将生成的公钥 (.pub 为后缀) 上传到 git 网站上

1
2
3
4
5
eval $(ssh-agent -s) //确定ssh-agent正在运行

ssh-add ~/.ssh/id_rsa //添加ssh私钥到客户端

ssh git@github.com //测试

1.3 设置用户名和邮箱

1
2
git config --global user.name "NAME HERE"
git config --global user.email "aaa@qq.com"

2.管理项目

2.1 管理本地已有项目

  1. 在项目的目录下执行以下命令(git bash)初始化仓库
1
git init

项目下会多出.git 文件夹(默认隐藏)

  1. 将项目与远程仓库关联
1
git remote add origin git@github.com:arcsinW/OpenHelloCDUTUWP.git

若要修改远程仓库的地址,可以先删除后新建,或者直接修改

1
2
3
4
5
6
// 先删除后新增
git remote remove origin
git remote add origin https://github.com/arcsinw/OpenHelloCDUTUWP.git

// 直接修改
git remote set-url origin https://github.com/arcsinw/OpenHelloCDUTUWP.git
  1. 提交更改
1
2
3
git add . # . 是通配符,代表所有的文件
git commit -a -m "Initial commit" # -a 代表提交所有改动 untracked file不受影响
git push origin master

或者

1
2
3
git add . # . 是通配符,代表所有的文件
git commit # 接着在git bash 里的文本编辑器里写Commit message
git push origin master

2.2 从远程仓库获取项目

1
2
3
git clone https://github.com/libgit2/libgit2 //获取master分支

git clone -b dev https://github.com/libgit2/libgit2 // 获取dev分支

2.3 分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git checkout -b dev # 新建并切换到dev分支

git branch # 查看本地分支

git branch -a # 查看远程分支

git checkout master # 切换到master分支

git merge dev # 合并dev分支到当前分支

git merge --abort # 撤销合并

git branch -d dev # 删除dev分支

git push origin --delete dev # 删除远程dev分支

git checkout -b dev origin/dev # 从远程仓库拉取本地不存在的dev分支

下面是在当前分支为 signle_edition 时执行
git merge master时出现冲突的情况

<<<<<<< HEAD 到 =======的部分是当前分支 single_edition 的版本

======= 到 >>>>>>> master 是 master 中的版本
处理冲突就是手动选择保存哪个版本的代码

处理好冲突后,使用add将该文件标记为已解决状态

1
git add filename

2.4 版本控制

1
2
3
4
5
6
7
8
9
10
11
git rm readme.txt --cahced # 将文件untrack,--cached不删除文件

git rm readme.txt # 将文件untrack并删除

git log --pretty=oneline # 查看提交日志

git --no-pager log # log不分页

git reset --hard HEAD^ # 回退到上一commit

git reset --hard [commit_id] # 回退到指定commit,commit_id只需写前几位,能唯一确定这个commit即可

3. 其他操作

1. refusing to merge unrelated histories

加上--allow-unrelated-histories

1
git pull origin master --allow-unrelated-histories

2. 修改提交到远程仓库的 commit 信息

查看本地仓库的 log 信息,找到要修改的 commit 之前一个 commit 的 id

1
2
git log --pretty=oneline
git rebase -i [commit_id]

将要修改的 commit 信息前的 pick 改成 reword,保存后将出现修改 commit message 的 vim 窗口,修改后保存即可,此时本地的 log 已经修改成功,强制推送到远程仓库

1
git push -f origin master #覆盖远程仓库commit信息(也会覆盖其他人的提交,慎用-f)

如果要修改的不只是 commit message,就将要修改的 commit 信息前的 pick 改成 edit

1
2
3
git commit --amend #修改commit信息
git rebase --continue
git push -f origin master #覆盖远程仓库commit信息(也会覆盖其他人的提交,慎用-f)

3. 重新添加 .gitignore

1
2
3
git rm -r --cached .
git add .
git commit -m "add .gitignore file"

4. 查看版本控制下的文件

1
git ls-files

5. git stash

当你想切换分支,但工作区还有未提交的代码,而这个代码还没写完不想提交,这时候可以把当前的工作状态暂时存储起来

1
2
3
4
5
6
7
8
9
10
11
git stash  // 存储当前的变更

git status // 工作区此时clean了

git stash list // 查看所有的stash

git stash apply stash@{0} // 恢复stash@{0}这个stash(由上一步获得)

git stash show -p stash@{0} | git apply -R // 取消一个stash

git stash branch testchanges // 在新分支中查看stash

6. 在 Github 上发起 Pull Request

GitHub 从单机到联机:玩转 Pull Request

4. 一些问题的解决方案

4.1 fatal: sha1 file ‘‘ write error: Broken pipe

与 ssh 有关,将 remote 暂时换成 http 版本的就能提交成功
网上说可以修改服务器上 ssh 的设置来解决,我没有测试过

Reference

  1. https://git-scm.com/docs/
  2. git 提交 commit 后 push 到远程仓库,如何修改 commit 信息
  3. git 上传远程库错误“fatal: sha1 file ‘’ write error: Broken pipe”解决方案
  4. 【狀況題】修改歷史訊息 - 為你自己學 Git | 高見龍