git、GitHub用法
# 常用设置
# git远程仓库url的格式
git@gitee.com:colderleo/cmder_config.git
https://gitee.com/colderleo/allahk.git
2
ssh免密登陆,需要用git@xxx.git的形式,https不行。
# git配置
通过cat .git/config
查看本项目的配置文件
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://gitee.com/colderleo/cmder_config.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = colderleo
email = gaoliu@zju.edu.cn
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面的字段可以用git config
设置, 设置时也可以加上 --global 设置为全局的
# 设置用户名
git config user.name colderleo
# 设置全局用户名
git config --global user.name "colderleo"
# 查看所有配置,包括全局配置
git config --list
2
3
4
5
6
7
8
# git常用设置
git有3个区,工作区就是工作文件夹下面的东西,缓存区是add命令将工作区复制到缓存区(stage);版本库是comcmit命令将缓存区加入版本库,并清空缓存区。
#### 保存密码
git config --global credential.helper store
#### 去掉每次windows安全中心的验证
git credential-manager uninstall
# 忽略文件权限的改变
git config core.fileMode false
git config --global core.fileMode false
# 取消换行符转换
git config --global core.autocrlf false
2
3
4
5
6
7
8
9
10
11
12
# 添加仓库并提交
# 打开Git Shall, 或者cmd,cd到项目文件夹
cd D:\testGit
# 将该文件夹设为仓库
git init
# 添加改变至暂存区(stage),注意后面有个点
git add .
# commit当前工作
git commit -m "这是一次提交"
# git add 和 git commit 可以合并成一个操作,但是有新添加的文件就不行了。
git commit -am "这是一次提交"
# 如果提示 Please tell me who you are, 则需设置身份
git config user.name "cvster"
git config user.email "535674963@qq.com"
#git status是用来查看当前状态的,如果当前工作已经commit了,那么得到的回复是clean,如果当前的工作还没有commit,它会提示有了修改还没有add和commit。
git status
# git diff是用来查看修改了什么内容的。后面还可以加具体的文件名,比如git diff readme.txt
git diff
# git log用来查看存储的版本。 git reflog,显示简略的信息,每个commit显示一行
git log
git reflog
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 退回以前的版本
(hard后面是版本ID,这里HEAD^^就是退两个版本,一个^就是退回上一个版本)。或者第2种,2ccbf62是用git log查看到的版本ID,一长串字符串,它的头几个字符,不用全部输进去,会自动查找。太少也不行。这里退回之后再调用git log,就会发现版本只有这个版本以及它之前的版本,没有后面的版本了。但是用git reflog可以看到历史的所有版本控制命令以及对应的版本。
# 撤销并且不保存修改
git reset --hard HEAD^
git reset --hard 2ccbf62
# 将commit退回到暂存区,相当于只add了,没有commit
git reset --soft HEAD^
# 将commit退回到工作区,相当于没有add,不太好使
git reset --mix HEAD^
# 文件取消add
git reset <file>
2
3
4
5
6
7
8
9
10
11
12
退回以前的版本后再跳到后面的版本:用git reflog命令查看历史操作,然后用git reset --hard 2ccbf6c跳回去,也可以
git reset --hard HEAD~1
git reflog
git reset --hard 2ccbf6c
2
3
git checkout -- 某文件名,如果修改或者删除了该文件,但是并没有add进缓存区(自然也没有commit),那么这个命令可以将缓存区(add)或者版本库(commit,如果没有缓存)中的内容恢复到工作区,也就是撤销修改。
git checkout -- test.txt
# ssh登录同一主机设置多个账户
https://blog.csdn.net/houdabiao/article/details/111085020
假设git仓库地址为: git@126.89.64.7:user1/proja.git
登录git的多个用户名为user1, user2
先在~/.ssh
目录用 sshkey-gen 生生多个id_rsa和id_rsa.pub文件,比如id_rsa1.pub, id_rsa2.pub
然后在~/.ssh目录创建config文件并编辑:
Host 126.89.64.7
HostName 126.89.64.7
User user1
PreferredAuthentications publickey
IdentityFile /root/.ssh/id_rsa1
Host 126.89.64.7
HostName 126.89.64.7
User user2
PreferredAuthentications publickey
IdentityFile /root/.ssh/id_rsa2
2
3
4
5
6
7
8
9
10
11
对于user1的git仓库,需要cd到仓库目录下,设置用户名:
git config user.name user1
并且把id_rsa1.pub加入到自己git网页上的sshkey中。
此时user1的该仓库就可以免密push了. 注意Host后面的是该主机的别名,如果用了别名,那么git remote url 里也要用别名,二者保持一致
# Git使用Token进行pull和push
https://www.jianshu.com/p/3b4f7619999e
token就相当于是密码。
一.通过github创建新的access token 流程如下: 1.右上角头像->Setttings->Developer settings->Personal access tokens->Generate new token 2.日期我选择No expiration(无限期),授权范围的话全部选上。
填写Note,例如:myToken; 选择Expiration,选择无期限; 选择Select scopes,全选。 3.点击Generate token生成,令牌保存成功。记住,这个生成的令牌要保存好。如果丢了需要重新生成。
二.切换登录方式,使用最新的令牌登录。 直接用文本编辑器打开git项目根目录中 .git/config文件。(PS:注意.git是隐藏文件夹) 按照如下格式,修改url和fetch即可:
[remote "origin"]
url = https://用户名:<这里填access_token>@github.com/用户名/项目名.git
fetch = +refs/heads/*:refs/remotes/origin/*
2
3
实测 windows 2.16.2 版本可以正常使用 linux2.33.0版本在这种设置下push会提示 'remote-https' is not a git command, 可能要安装一些库
# Git远程操作
参考,http://www.ruanyifeng.com/blog/2014/06/git_remote.html
# git remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候,git remote命令列出所有远程主机。
# 为本地仓库增加一个远程主机
git remote add origin https://github.com/cvster/allahk.git
# 显示所有远程主机
git remote
# 显示远程主机的url
git remote -v
# 克隆版本库, 并将远程主机命名为jQuery。 不加-o的话,自动命名为origin
git clone -o jQuery https://github.com/jquery/jquery.git
# 显示主机详细信息,删除、重命名远程主机
git remote show <主机名>
git remote rm <主机名>
git remote rename <原主机名> <新主机名>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 拉取远程分支
# 查看远程分支列表
git branch -r
# 拉取远程分支
git fetch
# 或者 git fetch origin dev
# 本地新建dev分支并对应到远程的dev分支
git checkout -b dev origin/dev
# 拉取远程dev分支
git pull origin dev
# 删除远程分支 origin/branch1
git push origin --delete branch1
# 本地新建dev2分支
git branch dev2
# 切换到dev2分支
git checkout dev2
# 创建远程dev2分支并将本地dev2推送上去 貌似不能用-u
git push --set-upstream origin dev2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# git clone
远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone命令。
# 克隆jQuery的版本库。
git clone https://github.com/jquery/jquery.git
# 指定本地目录
git clone <版本库的网址> <本地目录名>
2
3
4
5
# 建立本地与远程分支的联系
如果本地分支不是从远程clone来的,可以用下面的方式建立联系
# git branch --set-upstream-to origin/master
git branch -u origin/master
2
# merge
如果提示'fatal: refusing to merge unrelated histories', 可以加上
--allow-unrelated-histories
# git pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
# 比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
#如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
2
3
4
5
6
7
# git push
# git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
# 将本地分支推送到远程主机origin的master分支上
git push origin master
# 这句是一样的意思
git push --set-upstream origin master
# 将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
$ git push origin master
# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。下面的命令表示删除origin主机的master分支。
$ git push origin :master
# 等同于
$ git push origin --delete master
# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。将当前分支推送到origin主机的对应分支。
$ git push origin
# 如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 可能出现的问题
# LF will be replaced by CRLF
如果系统出现如下警告:warning: LF will be replaced by CRLF,貌似不管也可以?
因为在windows中的换行符为 CRLF, 而在linux下的换行符为:LF使用git来生成一个rails工程后,文件中的换行符为LF, 当执行git add .时,系统提示:LF 将被转换成 CRLF。解决方法:先删除.git,再配置忽略。
git config --global core.autocrlf false
# untracked content
如果出现GitHub untracked content,可能是因为子文件夹中也添加了git
# .gitignore文件修改后不生效:
git rm -r --cached .
git add .
git status
2
3
# rename index.lock 失败
Git rename from index.lock to index failed. Should I try again?(y/n)
https://stackoverflow.com/questions/13635429/git-rename-from-index-lock-to-index-failed
可能是因为连上了ssh,可以先试着把ssh关掉。或者直接杀掉ssh的进程。
# 切换GitHub账户后,git push 失败
参考,http://www.imooc.com/article/257929
打开cmd,输入命令:rundll32.exe keymgr.dll,KRShowKeyMgr,出现存储的用户名和密码窗口
将github相关的条目删除
重新执行命令:$ git push -u origin master,提示输入账户名及密码后,成功。