首先需要在Ubuntu上安装git客户端,使用命令:
sudo apt-get install git
然后去github上注册一个账户
下来需要生成本地ssh-key,使用命令
ssh-keygen -t rsa -C "xxx@xxx.com"
把xxx换成你自己的邮箱,生成key后会提示你输入保存文件名(例如‘key’),可以留空,之后是密码,也留空,默认会在~/路径下生成.ssh文件夹,里面有id_rsa.pub就是生成的公钥,如果你填了文件名(刚才的‘key’),会在当前路径下生成 key.pub 和 key 两个文件,其中 key.pub 是公钥,key 是私钥。
使用任意文本编辑器打开 key.pub
gedit key.pub
然后复制里面的内容。
打开github主页,在你的账户Account settings里选择SSH Keys, 点一下右边的 Add SSH key,title随便填,Key里粘贴刚才复制的内容,保存,然后在终端使用如下命令进行测试。
ssh -T git@github
如果你看到Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.说明设置成功。
之后我们开始下代码:
在你想下载代码的github主页右下角找到 HTTPS clone URL,如下图,点击下面的SSH切换到SSH地址。
git config
先来设置一下git的相关信息:
git config --global user.name "your name"
git config --global user.email "xxx@xx.com"
把”your name”和”xxx@xxx.com”换成你自己的名字和邮箱,每次提交的时候会用到。
git config
有两种level,一种只对当前repo有效,不带--global
,另一种全局生效
git config alias.xx checkout
git clone
复制地址,在终端里输入:
git clone [url] [targetfolder]
之后你就能拿到代码了。
git pull
git pull
能够把远程服务器上的变更同步到本地库里,如果有冲突需要merge
git status & git add
在git commit之前,你可以使用
git status
察看当前改动情况,把你需要commit的改动使用
git add filename 添加一个改动(stage)
git add -A 添加所有改动(stage)
撤销错误的add,此时还没有运行commit(unstage)
git reset [files_to_remove_from_add]
添加到要提交的列表里,然后使用
git commit -m 'Comments'
commit到本地代码库上。
git add -A 和 git commit -m ” 可以合并成一条语句
git commit -am '[comment]'
检查无误后,使用
git push
提交到github上就ok了。
git checkout
切换branch
git checkout [branchname]
创建一个新的branch并checkout新建的branch
git checkout -b [branchname]
以一个branch为基础创建另一个branch
git checkout -b [targetBranch] [sourceBranch]
最后push新创建的branch
git push -u origin [targetBranch]
git branch
查看当前本地分支
删除本地分支
git branch -D [branchname]
git merge
把别的branch上(一般是master)上的变更merge到当前branch。
git merge [branchname]
例如
git merge master
这里有一点需要注意的,就是merge的是本地branch上的变更,例如你要merge master到当前branch,要确保master是最新的。最好先切换到master上pull一下,然后再进行merge,总结起来就是
git checkout master git pull git checkout [yourbranch] git merge master
把branch上某个改动的文件恢复到未改动版本(即undo)
git checkout [filepath]
git reset
重置git add的状态到未add之前,
git reset
强制放弃本地改动,比如在merge别的branch的时候不想merge了
git reset --hard
如果已经有本地的commit了,并且commit了多次,突然不想要本地的commit了,想把本地代码恢复到未更改的状态,
首先需要查看一共有几个commit,
通过,
git status
可以看到本地比远端版本超出了几个commit,假如1个,那么用下面的命令
git reset --hard HEAD^
如果commit超过1,那么用下面的命令
git reset --hard [commitnumber]
放弃本地commit
git reset --hard origin/[branch_name]
git cherry-pick
选择拿某一次改动到当前branch
git cherry-pick [commithash]
git blame
神技-查看文件每一行是由谁在哪次commit中修改的, 按q退出
git blame [filename]
git show
神技-查看其它branch中的文件
git show [branchname]:[filename]
天外飞仙神技-导出其它branch中的文件不切换branch
#此命令会把[branchname]上的[filename]文件保存为当前路径下的[newfilename] git show [branchname]:[filename] > [newfilename]
git log [path]
不传 [path] 参数会查看整个 repo 的提交历史,传 [path] 参数用于查看某个文件的提交历史
天外飞仙神技-查看已经被重命名的文件历史
git log --follow -p [path]
这样就能看到文件被更改前的历史啦,然后配合 git show 命令查看过去具体版本的改动啦
同步 fork
git remote add upstream git@源repo地址.git git remote -v git fetch upstream git checkout master git merge upstream/master
git stash
天外飞仙神技-在有改动的情况下(uncommitted changes) 切换branch,并把改动应用到新的branch上
git stash #此命令把当前branch上的改动(uncommitted changes)保存到stash缓存区,并恢复代码到未改动状态 git checkout [branchname] #切换到别的branch git stash pop #取出stash缓存区里最顶端的改动,应用到当前branch
git stash相关命令
git stash list #列出当前所有的stash缓存区的改动 git stash clear #清空stash缓存区 git show stash@{0} #查看stash缓存区顶部的改动 git stash apply stash@{1} #将指定版本号为stash@{1}的改动应用到当前branch git stash save "work in progress for foo feature" #为当前未提交改动加一个注释,并保存到stash缓存区 git stash apply stash^{/<regex>} 按正则表达式应用stash
下面的配置使得每次rungit pull
的时候会自动rebase,等同于git pull --rebase
的效果
git config pull.rebase true
下面的配置使得每次pull的时候会自动stash当前本地的改动,不用手动stash,并在pull之后stash pop本地change
git config rebase.autoStash true
在 rebase 时如果能够确定 rebase 冲突统统以自己的 change 或者他人的为准,可以用下面的命令
git rebase -X theirs[或者 ours] branchName
再提一个.gitignore文件,这个是git检测改动时会忽略文件的列表,把你不需要git检测的文件都添加进去,例如打build生成的obj,bin等文件夹,统统添加进去。你可以自己手动新建一个,放到代码跟目录下就可以了。
让git bash命令行显示时间戳
打开git安装目录下Git\etc\profile
或者Git\etc\profile.d\git-prompt.sh
搜索像下面这样的代码:
PS1="$PS1"'\n' # new line PS1="$PS1"'\[\033[32m\]' # change color PS1="$PS1"'\u@\h ' # user@host PS1="$PS1"'\[\033[33m\]' # change color PS1="$PS1"'\w' # current working directory if test -z "$WINELOADERNOEXEC" then PS1="$PS1"'$(__git_ps1)' # bash function fi PS1="$PS1"'\[\033[0m\]' # change color PS1="$PS1"'\n' # new line PS1="$PS1"'$ ' # prompt: always $
加一行
PS1="$PS1"' \t' # time
删除branch
删除本地branch
git branch -d [local_branch]
删除远程branch
git push origin --delete [remote_branch]
天外飞仙神技-删除本地所有除了 master 以外的 branch
git branch -d $(git branch --merged=master | grep -v master) #删除所有已经 merge 到 master 的本地 branch,除了 master git fetch --prune #删除所有本地的已经被远端删除的分支
根据 tag 创建 branch
有时候我们会根据某个特定的 tag 创建 branch,这时候需要运行如下命令:
git branch [branchName] [tageName]
模糊匹配 diff
可以使用通配符 *
进行模糊匹配,这样就不用敲完整代码啦,
git diff -- *xxx*
比如有个文件是
/home/desktop/aaaa/cccb/casdf/cda/hhh.cs
用 git diff 的时候可以
git diff -- *hhh*
就可以 diff 啦
参考链接:
【Github教程】史上最全github使用方法:github入门到精通
Git 教程 – Git 基本用法
日常使用 Git 的 19 个建议
Git Cheat Sheet
git stash和git stash pop
[…] http://www.boydwang.com/2014/01/git-notes/ https://www.lugir.com/git-basic.html […]