# 首次使用绑定账号,name和email为注册github/gitlab的账户名字和注册邮箱
git config --global user.name "name"
git config --global user.email "name@email.com"
# 创建SSH keys并在自己电脑上配置SSH。参考Sign in to GitHub · GitHub。SSH在本地配置好需要密码,后面下载上传代码都需要输入这个密码。好像可以设置为空或者配置成不需要每次都输入的形式。下面是网上找的一个在本地添加ssh方法:
## 1. git config —global user.name "yourname"
## 2. git config —global user.email yourname@email.com
## 3. Add SSH Keys(10.101.114.15)
1. 1. Run CMD/Powershell/Terminal with administrative (sudo) privilege. (In windows run cmd as administrator. In linux execute ‘sudo su’ to get root privilege).
2. Type
ssh-keygen
.
You will see the following. Here you will be asked for the location where the SSH key will be saved. Press enter to accept default or enter your custom location.
```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yourname/.ssh/id_rsa):
```
3. Git will ask you to save the key to the specific directory.You will be asked for a password. Make sure you remember it since it will be needed for cloning.
```
Enter passphrase (empty for no passphrase):
```
4. The public key will be created to the specific directory.
5. Now go to the directory you have specified in *Step 2* and open `.ssh` folder.
6. You’ll see a file `id_rsa.pub`. Open it on notepad. Copy all text from it.
7. Go to https://gitlab.com/profile/keys
Here you can see all the SSH keys specified so far. Paste the copied key.

8. Now click on the “Title” below. It will automatically get filled based on the value taken from the SHA Key.
9. Then click “Add key” and that’s it. You have successfully configured SSH.
10. Now try cloning again. Git will ask for a password. Give the password you have given in Step 2.
## 4. git clone
# 下载代码
git clone git@github.com:duanyzhi/resnet_cifar10_cifar100_imagenet.git
git clone后面跟SSH下载链接:
通过token提交代码
1. Seeting->Developer Settings获取token
2. git remote set-url origin https://<token>@github.com/duanyzhi/novamind.git
3. git push XXX
github这些一个代码会有很多个分支,可以理解成不同的版本,创建新分支:
# git checkout -b new_branch # 创建new_branch新分支
git checkout -b new_branch origin/master # 创建新分支并和master主分支关联
git pull # 从主分支下载代码到new_branch分支
# 查看分支状态语句:
git branch # 查看所有分支和当前所在分支
git status # 查看工作区状态
git branch -r # 查看所有分支名
# 提交代码
1. 如果是自己创建的项目,即master分支是自己的,则提交流程为:
1. git clone XXX # 下载代码
2. 第二步修改代码
3. git add . # git add .表示add 当前文件夹及其子目录下更改的所有文件,不会add上层目录文件
4. git commit -m "提交代码" # 添加commit注释,一般用来说明这次提交的代码修改了什么
5. git push # 向自己的master分支提交代码,或者git push -u origin master
# 如果有问题可以git push -f origin feature_dev 强制push更新
2. 如果不是自己创建的仓库项目,则对master分支没有直接提交代码的权限。那么需要创建一个自己的分支,然后向自己的分支提交在申请合并到master分支:
1. git clone XXX
2. git checkout -b new_branch origin/master
3. git pull
4. 修改代码
5. git branch
6. git status # 列举出改动的文件,红色是修改的
7. git diff # 查看不同
8. git add .
9. git commit # 直接输入命令后回车会弹出vim界面,在首行添加commit信息
10. git push origin new_branch # 提交代码,并申请合并到master分支
或者直接在master上修改,提交时 git push origin master:new_branch # 创建new_branch并提交到master上
11. 在网页github对应仓库下点击申请合并
# 注意:
# 1. 不要在master分支上开发代码。
# 2. 新建一个开发分支和一个提交代码的分支。开发分支可以保存开发代码,然后cherry-pick提交代码到提交代码分支在提交。
# 更新最新代码到本地
git checkout master && git pull
# 如果本地在代码上有改动,然后还希望将最新的代码更新到本地和自己写的进行合并
git stash # 把自己修改的部分放在一个缓存区
git checkout master && git pull # 切换到master分支并下载最新代码
git stash pop # 把自己更改的代码从缓存区下载下来和master代码进行合并
# 出现unmerged file
git status # 查看有哪些unmerged file
git diff # 查看改动
git log # 查看历史版本
git commit --amend
在git commit 后面的一串数就是之前每个版本的节点地址,比如初始节点地址为1759e5200f07702195ad15d17de9d1e5af9d6cf2
git reset --hard 1759e5200f07702195ad15d17de9d1e5af9d6cf2 # 返回节点id对应的节点代码,不需要在git pull
# 如果本次提交有问题,可以使用
git reset 42759ccbda
# 这样就切回到了上一次提交的状态,那么刚才添加或修改的文件就会重新回到需要添加的状态
git status # 查看当前状态即可,然后再次修改再次提交
git reset --hard FETCH_HEAD # 也可以直接 放弃本次修改,返回上一个pull成功的节点
# 如果希望切换到某一个固定的id,一般要新建一个分支:
git checkout -b <new_branch_name> <SHA1>
# 放弃本地所有更改并更新到最新master分支代码
git fetch --all
git reset --hard origin/master
git pull
# 只更新某一个文件
# 删除一个分支
git branch -d branch_name
# 报错you need to resolve your current index first。这是因为冲突错误,merge失败,有conflicts没解决。
git reset --merge # 回退到merge前的版本
# git add .之后希望撤回所有的提交
git reset HEAD
# 如果在master修改了东西,想保留修改但又希望拉一个最新master来做其他测试,则需要本地新建一个分支将保存放在新分支上就可以了。假设当前在master分支:
git add -u
git stash # 保存修改
git stash list
git checkout -b master_dyz # 新建一个master_dyz分支,因为是在master新建的,所以分支内容和master一样
git stash apply # 在当前分支上应用修改
# 如果在release分支修改内容只希望保留部分文件并加到master分支上
git diff # 查看release分支所有改动
git add doc_a.cpp # 添加希望保存的文件
git add -u # 一次把所有的modified的文件都add进来
git reset # 如果git add添加了错误文件,用reset重置add
git stash # 将git add 的文件保存在缓存区
git stash show # 显示所有添加到缓存的文件
git checkout master # 切换master
# 这个时候一般会报错:
# error: The following untracked working tree files would be overwritten by checkout:
# XXXX.cpp
# ....
# Please move or remove them before you can switch branchs.
# 这是由于这些文件和master冲突,可能是新的文件没有添加到git add,可以执行:
git checkout -f master # 丢弃所有冲突文件,强制切换到master
git stash pop # 从缓存区拿取文件并merge到master上
# 查看某个文件被哪些人编写提交过
git blame main.cpp # 会出现每一行的提交信息
# git cherry-pick 把某个分支的提交申请合并到另一个分支:
# 1. 首先在release分支找到某次希望合并到master分支的commit id,这里是acdc2410*
git diff commit_id # 查看某个commit id的代码改动有哪些
# 2. 从release分支切换到master分支
git checkout master
git cherry-pick acdc24105d5a3df700b860c914bdd7aef906e410
# OK,也可以从网页点击cherry-pick合并,不过如果有冲突的话需要解决
# 如果有冲突,修复冲突
git add -u
git commit
# git pullmaster分支代码到开发分支
git checkout develop # gets you "on branch develop"
git fetch origin # gets you up to date with origin
git merge origin/master
# 一个文件修改后如果希望还原成原始状态
git checkout file.cpp # 还原成git pull之后的原始文件
# 也可以到某个目录下git checkout branch,将单个目录切换到固定分支
git checkout -- . # 还原所有修改的文件
# 查看文件是否被更改
md5sum file_name # 查看file_name的md5值
sha256sum file_name # 查看256sha值
# patch
对于某一个提交希望将其发给其他人的话可以使用patch来,生成patch:
git format-patch -1 commit_id # 将某一次的提交生成patch
git format-patch -3 # 从当前分支最新提交点往下共生成3个补丁
git apply --stat 0001-you-patch.patch # 查看path改动
git apply 00001-you-patch.patch # 在当前代码路径下应用patch,即把patch的代码加入到当前目录下
git am *.patch # apply patch并保留commit信息
# 多个commit合成一个patch, commit之间用^..
git format-patch begin_commit^..end_commit --stdout > output.patch
代码提交了还没合进仓库,发现需要修改提交的代码:
# your_branch本地分支先修改
git add -u
git commit --amend # 在之前的提交上添加一次修改
git push --force origin your_branch
# 撤销amend
git reflog # 查看git信息
# d5c1c81 HEAD@{0}: commit (amend): add ops
# 72f8ddf HEAD@{1}: commit: add ops
git reset --soft HEAD@{1} # 回到amend之前,重新commit即可
删除已经合并到master分支的某次提交
git revert commit_id
# 怎么从master分支向开发分支rebase代码。(如果自己的开发分支和master分支相差较远需要将master分支代码rebase到开发分支)
# 切到开发分支feature_dev
git fetch origin # 更新master分支代码
git rebase origin/master # rebase master代码到feature_dev
# 如果有冲突
git status # 查看冲突并本地修改
git add -u # 将修改文件add
git rebase --continue # 继续rebase
git log # 查看master最新代码是否已经合入
# 更新子仓代码
git pull origin dev # 更新dev分支代码
# 查看提交代码数量
git log --author="name" --after="2020-01-01" # 查看某人从0101号之后的所有提交
git rev-list --count master # 查看master分支所有提交的commit个数
git shortlog -s -n master --no-merges # 列出所有人在master分支上提交的已经合并的commit个数
git shortlog -s -n --all --no-merges # 列出所有分支上的提交代码个数
# shell中获取当前commit id
git describe --tags --always
# git无法使用tab键
apt-get install git bash-completion
# 设置git默认编辑器为vim(或者直接编辑~/.gitconfig)
git config --global core.editor vim
# 显示当前仓库的root目录
git rev-parse --show-toplevel
#使用tig
apt-get install tig
tig
# j/k for up/down
# 回复git resert --hard 之前的文件(该方法仅对resert之前执行过git add命令有效,有git add的git才会有记录)
find .git/objects -type f | xargs ls -lt | sed 20q # 查看最新的20次git add提交.
# root 7 15:24 .git/objects/c2/9795d94ad7684115fa818da21638ee7277deb6
# root 7 15:21 .git/objects/b5/528ae3b0838ec110bbed43cb6fb56d2f72af0c
# ...
# 一般要恢复的是第一个coomi
# 恢复文件:
git cat-file -p c29795d94ad76 # 可能需要加上前面的c2前缀
# 把某一个文件reset到某个commit
git checkout commit_id path/to/file/name
# 查看git add的内容修改
git diff --cached
# token
# token生成后使能
git config --local --unset credential.helper
git remote set-url origin https://your_token@github.com/duanyzhi/novamind.git/
# git clone代码time out问题
git config --global http.proxy http://127.0.0.1:port
git config --global https.proxy http://127.0.0.1:port
# port是科学上网的端口号
# DNS污染导致无法访问raw.githubusercontent.com
1. 打开https://www.ipaddress.com/输入raw.githubusercontent.com并记录真是ip地址
2. windows下管理员身份打开powershell,cd C:\Windows\System32\drivers\etc
3. shell terminal下输入notepad并打开C:\Windows\System32\drivers\etc\hosts并在文本加入对应ip:
ip raw.githubusercontent.com
4. ipconfig /flushdns # 刷新DNS缓存即可
# fatal: not a git repository:
对submodule更新的时候失败:
rm -rf third_party/submodule_pkg_name
rm -rf .git/modules/third_party/submodule_pkg_name # remove .git cache
git fetch --all
git submodule update --init
git rm --cached third_party/submodule_pkg_name
git submodule deinit third_party/submodule_pkg_name # remove cache
git submodule add submodule_git_url thirdy_party/submodule_pkg_name
git submodule sync
git submodule update --init
# git push失败
remote: Permission to xxx/xxx.git denied to duanyzhi.
fatal: unable to access 'https://github.com/xxx/xxx.git/': The requested URL returned error: 403
# 解决方法
vim .git/config
change: url:https:/xxx/xxx.git to git@github.com:xxxx/xxx.git