最近研究了一下git和github。
网上找了些资料学习,做了点笔记,记录一波。
不足之处还请指出.
参考学习网址,强推廖雪峰老师的git教程:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
关于作者
github: https://github.com/Sunyelw
gitee: http://gitee.com/Sunyelw
共同学习,共同进步。
执行命令,没有任何显示,表示执行成功,
Unix的哲学是“没有消息就是好消息”,说明执行成功。
一、基本操作
$ git config --global user.name "Your name"
$ git config --global user.email "eamil@address.com"
# 创建版本库 Repository
$ mkdir learngit
$ cd learngit
$ pwd
$ git init
$ git status
Changes ...
<filename1>
<filename2>
...
# 下面的文件表明被修改,注意:是修改之前就存在的文件.
Untracked ...
<filename1>
<filename2>
...
# 下面的文件表明未提交,是之前从来没有存在的,属于新增.
### ### ### ### ### ### ### ### ### ### ### ### ###
PS:以上两者都需要用 add 命令提交[文件更改]到暂存区(stage/index),
然后把这一步都做完了, 就可以把[修改]提交到分支了,用 commit -m 命令.
### ### ### ### ### ### ### ### ### ### ### ### ###
Change not staged for commit ...
<filename1>
<filename2>
...
no change added to commit<use "git commit -a" or "git add ">
# 这是表示你修改了 <filename>文件 但是没有执行
# add <filename> 命令,你需要执行此命令提交到暂存区.
Changes to be committed ....
<filename1>
<filename2>
...
# 然后下面是一串文件名,表示你已经添加到暂存区的文件(执行了"git add <filename>"命令),等待提交到分支.
# 一些命令
$ git diff <filename> # 文件名数字好像不支持。
$ git add . # 提交所有修改与新增到暂存区(stage/index)
$ git add <filename> # 提交指定文件到暂存区
$ git cat <filename> # 查看当前文件内容
$ git commit -m "description" # 从暂存区提交到分支
$ git push origin master # 提到到远程库
# 提交: git push (-u) [库名称] [分支名]
# 关联远程库
$ git remote add origin git@github:Sunyelw/TestGit.git
# 如果报错已存在 origin,那就换个名字,不用origin,比如ori也行
# 删除已有的远程库。
$ git remote rm origin
$ git remote rm <repo-name> # 自定义的名称,一般是origin
# 关联多个远程库
$ git remote add github git@github.com:Sunyelw/TestGit.git # 库名:github
$ git remote add gitee git@gitee.com:Sunyelw/TestGit.git # 库名:gitee
# 查看远程库
$ git remote -v
# 时光穿梭
$ git log
$ git reset --hard HEAD^
$ git reset --hard HEAD^^ # HEAD^100
$ git reset --hard fe194ab # 回 溯
# 显示颜色。
$ git config --global color.ui true
# 配置别名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset - %C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
注:--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
# 删除别名
$ git config --global --unset alias.st
配置文件一样有3层,系统级,用户级,项目级。
加了--global选项的,表示配置到了用户级,--system是系统级,win是在安装目录(如C:\Program Files\Git\mingw64\etc),若没有不加就在项目级中。
在命令行中,起同样的别名,前面的会被直接覆盖。
如果别名是其本身的命令,比如git config --global alias.add commit,
再运行git add时仍然是原add暂存功能,优先识别内置的命令,其次才别名。
# 查看版本号
$ git reflog
$ git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-commit --reflog
# shift+ ; +q # 退出。
add: 工作区(即初始创建的仓库:文件夹TestGit)-->版本库(.git)中的暂存区stage(index)
# .git文件夹隐藏在仓库内,但并不算工作区,而是版本库(repository)
commit: stage --> master(当前分支,例如master)
# 推送
$ git push origin master
二、进阶
# 克隆。
$ git clone git@github.com:Sunyelw/TestGit.git
$ git clone [URL]// HTTPS/SSH 协议。
# ps:SSH 速度更快。
# 克隆指定分支的项目
$ git clone [-b <分支名称>] <url>
# 分支 branch
创建+切换 $ git checkout -b dev//" $ git branch dev" + "$ git checkout dev"
创建 $ git branch dev
切换 $ git checkout dev
查看 $ git branch
删除 $ git branch -d dev
合并至当前分支: $ git merge dev//把dev分支的最新代码合并到master内。
存储工作现场: $ git stash
查看存储工作: $ git stash list
恢复现场工作: ① $ git stash apply +$ git stash drop
② $ git stash pop
③ $ git stash apply stash@{0}
bug修复:出现bug100,先stash工作现场,然后切换到想要修复bug100的分支,比如master,再度当前分支创建临时分支 issue-100,修复后合并 删除临时分支 issue-100.
标签:
# 创建
$ git tag <tagname>
$ git tag -a v1.0 -m "description" <commit number>
$ git tag -s <tag name> -m "description" <commit number>
# 上传
$ git push t```````
g <tag name> #单个
$ git push origin --tags #所有
# 删除
$ git tag -d <tag name> #本地删除
$ git origin: refs/tags/<tag name> #远程删除
多提一句,码云(gitee.com)其实就是一个中文版的GitHub,而且支持私有化你的项目,很强大,嗯,我赌五毛这两者肯定有PY关系…
这里讲下工作区、暂存区、分支三者的关系。如图:
工作区就是你的仓库,那个 .git 文件同一路径下的都是工作区,
除了那个 .git 。 没错 .git 是版本库,这里面有暂存区和分支。
diff的用法
$ git diff HEAD – a.txt # 比较工作区的当前版本与 版本库里面提交(commit)的最新版本间的区别,
而不是与版本库里暂存区内的版本作比较。
git diff 是工作区和暂存区的对比
git diff – cached 是暂存区和分支的对比
git diff HEAD – readme.txt 工作区和分支的对比
三、常见问题(不定时添加)
- 推送失败问题
$ git push origin master
To github.com:Sunyelw/TestGit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:Sunyelw/TestGit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details. ##
在我们利用git作为项目版本控制时, 工作流程通常是这样的:
(1)在每天开始工作前, 先把中央仓库里的最新代码给pull下来, 然后你可以进行你的工作, 创建新分支或提交之类.
(2)一天的工作结束后, 你需要把代码push到仓库.
如果没有第一步操作, 你push的时候就可能会出现上面这种情况.
有两种解决方法:
(1) 先pull下来, 然后解决冲突, 再次提交.(这里假设只有一个a.txt文件有冲突, 通常情况是不可能这么舒服滴…..)
$ git pull
$ git cat a.txt
$ git vim a.txt
$ git add a.txt
$ git commit -m "kill confliction"
$ git push origin master
(2)rebase 或 merge
$ git rebase origin master
或者
$ git merge orgin
merge跟rebase的区别就是历史记录, 如果你不确定用哪种,请用pull.
其实pull是下面两步操作合并而成的:
$ git fetch
$ git merge origin/master
更新于 2017-12-30 16:50
2 合并失败问题
应用场景,我本地有一个文件夹,我想把这个文件夹放到我的码云库上面。
我的做法:
(1)码云上建了一个库
(2)在我这个文件夹里面关联这个库。
(3)然后出现推送失败问题。
按提示解决:
1.关联上传流
git push --set-upstream origin master
2.合并(这里无法使用git pull 来将远程分支里面的东西拉下来,因为 unrelated)
git merge origin/master --allow-unrelated-histories
ps: 还要一种操作
git pull --rebase origin master
同样是拉取.
3.推送
git push
更新于2018-01-31 16:31
更新于2018-04-01 16:33
end.