A. 如何用git來進行多人協作,管理自己的代碼
首先,A得有一個github上的賬戶,如沒有請先注冊申請,然後安裝git操作工具,登陸你的github,然後找到A要參與的項目P,點進項目中你會看見watch,star,fork,那麼這分別是什麼意思呢?1.想拷貝別人項目到自己帳號下就fork一下。fork的作用是參與,目的是你增加新的內容,然後PullRequest,把你的修改和主倉庫原來的內容合並2.持續關注別人項目更新就star一下star的作用是收藏,目的是方便以後查找3.watch的作用是關注,目的是等作者更新的時候,你可以收到通知。點擊fork一下,這樣就將原項目弄到A的github倉庫中了,這樣這個項目就是你自己的了那麼A修改後,如何提交給B呢,首先,修改fork過來的代碼,A修改完後將其push到P1,然後點擊pullrequest按鈕,如圖中2所示
B. 如何優雅地使用 Git
Github 相信已經成為家喻戶曉的代碼託管工具, 但訪問了多位周圍編程愛好者後發現, 對其的使用還僅限於 下載項目源碼 和 備份項目源碼 的程度, 今天我就來介紹一下一個比較重要的使用場景 貢獻代碼
以 swoole 為例:
Fork 項目
首先需要fork這個項目, 進入項目頁面, 點擊右上角的Fork按鈕
你的 github 帳號中會出現 swoole/swoole-src 這個項目
在本地電腦(linux)上使用以下命令: 得到一個 swoole-src 文件夾
git clone [email protected]:samt42/swoole-src.git
獲取原項目代碼
進入 swoole-src 文件夾, 添加 swoole 的遠程地址
git remote add upstream
獲取 swoole 最新源碼
git pull upstream master
現在我們在 fork 來的 master 分支上, 這個 master 留作跟蹤 upstream 的遠程代碼...
創建分支
好了, 現在可以開始貢獻我們的代碼了
按照國際慣例, 我們一般不在 master 上提交新代碼, 而需要為新增的功能或者fixbug建立新分支, 再合並到 master 上, 使用以下代碼創建分支
git checkout -b branch1
現在我們可以在分支上更改代碼了
假設我們已經添加了一些代碼, 提交到代碼庫
git commit -a -m "new commit"
合並修改
一個常見的問題是遠程的 upstream (swoole/swoole-src) 有了新的更新, 從而會導致我們提交的 Pull Request 時會導致沖突, 因此我們可以在提交前先把遠程其他開發者的commit和我們的commit合並.
使用以下代碼切換到 master 分支:
git checkout master
使用以下代碼拉出遠程的最新代碼:
git pull upstream master
切換回 branch1:
git checkout branch1
> 如果忘記自己之前建的分支名可以用 `git branch` 查看
把 master 的 commit 合並到 branch1:
git rebase master
把更新代碼提交到自己的 branch1 中:
git push origin branch1
Pull Request
提交 Pull Request
你可以在你的 github 代碼倉庫頁面切換到 branches 頁面點擊 branch1 分支後點擊 New pull request 按鈕, 添加相關注釋後提交.
OR
切換到 branch1 分支的代碼倉庫點擊 Compare & pull request 按鈕, 添加相關注釋後提交.
C. git 命令查看遠程tag
【查看遠程分支】
$ git branch -a
master
remote
tungway
v1.52
* zrong
remotes/origin/master
remotes/origin/tungway
remotes/origin/v1.52
remotes/origin/zrong
【刪除遠程分支和tag】
$ git push origin --delete <branchName>
【刪除tag這么用】
git push origin --delete tag <tagname>
否則,可以使用這種語法,推送一個空分支到遠程分支,其實就相當於刪除遠程分支:
git push origin :<branchName>
這是刪除tag的方法,推送一個空tag到遠程tag:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
兩種語法作用完全相同。
【重命名遠程分支】
$ git branch -av
* devel 752bb84 Merge pull request #158 from Gwill/devel
master 53b27b8 Merge pull request #138 from tdlrobin/master
zrong 2ae98d8 modify CCFileUtils, export getFileData
remotes/origin/HEAD -> origin/master
remotes/origin/add_build_script d4a8c4f Merge branch 'master' into add_build_script
remotes/origin/devel 752bb84 Merge pull request #158 from Gwill/devel
remotes/origin/devel_qt51 62208f1 update .gitignore
remotes/origin/master 53b27b8 Merge pull request #138 from tdlrobin/master
remotes/origin/zrong 2ae98d8 modify CCFileUtils, export getFileData
【刪除遠程分支】
$ git push --delete origin devel
To [email protected]:zrong/quick-cocos2d-x.git
- [deleted] devel
【重命名本地分支】
git branch -m devel develop
【推送本地分支】
$ git push origin develop
Counting objects: 92, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (48/48), done.
Writing objects: 100% (58/58), 1.38 MiB, done.
Total 58 (delta 34), reused 12 (delta 5)
To [email protected]:zrong/quick-cocos2d-x.git
* [new branch] develop -> develop
D. linux怎樣命令行上傳git
你是你是要通過git命令上傳東西,還是想上傳git到伺服器上面,你可以先通過yum安裝git
#yuminstallgit
已載入插件:fastestmirror,refresh-packagekit,security
設置安裝進程
Loadingmirrorspeedslinuxprobe.comfromcachedhostfile
base|3.7kB00:00
epel|4.3kB00:00
epel/primary_db|5.9MB00:05
extras|3.4kB00:00
hhvm|2.9kB00:00
shells_fish_release_2|1.2kB00:00
updates|3.4kB00:00
updates/primary_db|821kB00:01
upgrade|1.9kB00:00
virtualbox/signature|181B00:00
virtualbox/signature|1.1kB00:00...
包git-1.7.1-8.el6.x86_64已安裝並且是最新版本
無須任何處理
#git--help
usage:git[--version][--exec-path[=GIT_EXEC_PATH]][--html-path]
[-p|--paginate|--no-pager][--no-replace-objects]
[--bare][--git-dir=GIT_DIR][--work-tree=GIT_WORK_TREE]
[--help]COMMAND[ARGS]
:
addAddfilecontentstotheindex
branchList,create,,commitandworkingtree,etclogShowcommitlogs
mvMoveorrenameafile,adirectory,orasymlink
rebaseForward-
showShowvarioustypesofobjects
tagCreate,list,
See'githelpCOMMAND'.
下面我給介紹一種從本地上傳到伺服器的命令:
命令rz和sz命令,首先你需要安裝lrzsz庫
#rz--help
rzversion0.12.20
Usage:rz[options][filename.if.xmodem]
ReceivefileswithZMODEM/YMODEM/XMODEMprotocol
(X)=optionappliestoXMODEMonly
(Y)=optionappliestoYMODEMonly
(Z)=optionappliestoZMODEMonly
-+,--appendappendtoexistingfiles
-a,--asciiASCIItransfer(changeCR/LFtoLF)
-b,--binarybinarytransfer
-B,--bufsizeNbufferNbytes(N==auto:bufferwholefile)
-c,--with-crcUse16bitCRC(X)
-C,--allow-remote-(Z)
-D,--nullwriteallreceiveddatato/dev/null
--delay-
-e,--escapeEscapecontrolcharacters(Z)
-E,--
--(debugging)
-h,--helpHelp,printthisusagemessage
-m,--min-
-M,--min-bps-timeNforatleastNseconds(default:120)
-O,--disable-timeoutsdisabletimeoutcode,waitforeverfordata
--o-syncopenoutputfile(s)insynchronouswritemode
-p,--protectprotectexistingfiles
-q,--quietquiet,noprogressreports
-r,--(Z)
-R,--restrictedrestricted,moresecuremode
-s,--stop-at{HH:MM|+N}stoptransmissionatHH:MMorinNseconds
-S,--timesyncrequestremotetime(twice:setlocaltime)
--syslog[=off]turnsyslogonoroff,ifpossible
-t,--
-u,--keep-
-U,--(ifallowedto)
-v,--verbosebeverbose,providedebugginginformation
-w,--windowsizeNWindowisNbytes(Z)
-X--xmodemuseXMODEMprotocol
-y,--overwriteYes,clobberexistingfileifany
--ymodemuseYMODEMprotocol
-Z,--zmodemuseZMODEMprotocol
#sz--help
szversion0.12.20
Usage:sz[options]file...
or:sz[options]-{c|i}COMMAND
Sendfile(s)withZMODEM/YMODEM/XMODEMprotocol
(X)=optionappliestoXMODEMonly
(Y)=optionappliestoYMODEMonly
(Z)=optionappliestoZMODEMonly
-+,--(Z)
-2,--twostopuse2stopbits
-4,--try-4kgoupto4Kblocksize
--start-4kstartwith4Kblocksize(doesn'ttry8)
-8,--try-8kgoupto8Kblocksize
--start-8kstartwith8Kblocksize
-a,--asciiASCIItransfer(changeCR/LFtoLF)
-b,--binarybinarytransfer
-B,--bufsizeNbufferNbytes(N==auto:bufferwholefile)
-c,--(Z)
-C,--command-(Z)
-d,--dot-to-slashchange'.'to'/'inpathnames(Y/Z)
--delay-
-e,--(Z)
-E,--
-f,--full-pathsendfullpathname(Y/Z)
-i,--immediate-commandCMDsendremoteCMD,returnimmediately(Z)
-h,--helpprintthisusagemessage
-k,--1ksend1024bytepackets(X)
-L,--(Z)
-l,--(l>=L)(Z)
-m,--min-
-M,--min-bps-timeNforatleastNseconds(default:120)
-n,--newersendfileifsourcenewer(Z)
-N,--newer-or-(Z)
-o,--16-bit-(Z)
-O,--disable-timeoutsdisabletimeoutcode,waitforever
-p,--(Z)
-r,--(Z)
-R,--restrictedrestricted,moresecuremode
-q,--quietquiet(noprogressreports)
-s,--stop-at{HH:MM|+N}stoptransmissionatHH:MMorinNseconds
--
--tcp-serveropensocket,waitforconnection
-u,--
-U,--(ifallowedto)
-v,--verbosebeverbose,providedebugginginformation
-w,--windowsizeNWindowisNbytes(Z)
-X,--xmodemuseXMODEMprotocol
-y,--
-Y,--overwrite-or-skipoverwriteexistingfiles,elseskip
--ymodemuseYMODEMprotocol
-Z,--zmodemuseZMODEMprotocol
.com。
E. 如何刪除git pullrequest
所有沒有 commit 的本地改動,都會隨著 reset --hard 丟掉,無法恢復。 如果只是想回到 pull 之前當前分支所在的commit位置,則可以。比方說你在 master 分支上,可以用 git reflog master 查看 master 分支歷史變動記錄,其中應該有一個就是你 ...
F. git clone 太慢怎麼辦
Git 和 GitHub
的出現打開了開源世界的另一扇大門,版本控制變得更強大(也更復雜),項目的管理變得更加容易,項目的開發也變得更容易進行多人協作。GitHub
無疑是程序員的 Facebook
,在這里匯聚了無數世界頂級的項目以及頂級的程序員,你可以為你感興趣的項目加星(Star),可以關注任何人(Follow)以及他們的項目
(Watch),而且更贊的是,你可以復制一份別人項目的副本(Fork),來進行自己的修改,如果你願意的話,你還可以向項目的原作者發起請求
(Pull Request),將你做的修改合並到原項目中。這樣無論你是什麼人,來自不同的國家,擁有不同的技能,都可以對所有開源的項目作出貢獻。
盡管上面描述的開源世界如此美好,但是在大天朝,在牆內,你卻完全無法領略。因為當你訪問 GitHub 時,或者使用 git clone 興致勃勃的下載你感興趣的項目時,巨慢的速度將徹底擊毀你的信心,最終只好放棄表示玩不起。
強大的長城技術對 GitHub 網開一面,沒有像 Google 或 Facebook 這樣直接斬盡殺絕,但是對它做了嚴格的限速,這種折磨比直接斃了更痛苦( 有網友表示,有些地區速度很快,有些地區速度很慢,也有可能是和網路運營商有關 )。如上圖所示, git clone 的下載速度從來沒有超過 10KiB/s ,這也就意味著一個 100MiB 的項目,需要近三個小時才能下完,而且由於網路的不穩定性,下載過程中偶爾會出現斷開連接的情況,由於 git clone 不支持斷點續傳,這讓幾個小時的下載時間白白浪費掉,只能重新開始。
這篇文章將介紹幾種方法來快速從 GitHub 上下載代碼。
一、git shallow clone
git clone 默認會下載項目的完整歷史版本,如果你只關心最新版的代碼,而不關心之前的歷史信息,可以使用 git 的淺復制功能:
$ git clone --depth=1 https://github.com/bcit-ci/CodeIgniter.git
--depth=1 表示只下載最近一次的版本,使用淺復制可以大大減少下載的數據量,例如, CodeIgniter 項目完整下載有近 100MiB ,而使用淺復制只有 5MiB 多,這樣即使在惡劣的網路環境下,也可以快速的獲得代碼。如果之後又想獲取完整歷史信息,可以使用下面的命令:
$ git fetch --unshallow
或者,如果你只是想下載最新的代碼看看,你也可以直接從 GitHub 上下載打包好的 ZIP 文件,這比淺復制更快,因為它只包含了最新的代碼文件,而且是經過 ZIP 壓縮的。但是很顯然,淺復制要更靈活一點。
二、GUI 工具 + 代理
如果很有幸你正在使用代理,懂得如何翻牆的話,那麼訪問 GitHub 對你來說應該不在話下。下載 GitHub
上項目的最簡單的方法就是使用一款圖形化界面(GUI)的 Git 工具,這樣的工具現在比比皆是。使用 GUI
工具方便的地方在於,可以在設置中配置是否要使用代理,將你翻牆所使用的代理 IP 拿過來配置上就 OK 了,或者更直接的,將代理配置為系統代理。
三、git + http.proxy
如果你跟我一樣,喜歡使用原生的 git 命令,喜歡在命令行下操作的那種感覺,那麼也可以在命令行下直接配置 git 使用代理,當然前提一樣是,你懂得如何翻牆。
$ git config --global http.proxy http://proxyuser:[email protected]:8080
$ git config --global https.proxy https://proxyuser:[email protected]:8080
使用上面的命令配置完之後,會在 ~/.gitconfig 文件中多出幾行:
[http]
proxy = http://proxyuser:[email protected]:8080
[https]
proxy = https://proxyuser:[email protected]:8080
你也可以使用下面的命令檢查配置是否生效:
$ git config --global --get http.proxy
$ git config --global --get https.proxy
另外,如果你想取消該設置,可以:
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy
配置完成後,重新 clone 一遍,可以看到速度得到了極大的提升!
題外話:在命令行中如何使用代理?
要注意的是使用 git config --global 配置的代理只能供 git 程序使用,如果你希望讓命令行中的其他命令也能自動使用代理,譬如 curl 和 wget 等,可以使用下面的方法:
$ export http_proxy=http://proxyuser:[email protected]:8080
$ export https_proxy=https://proxyuser:[email protected]:8080
這樣配置完成後,所有命令行中的 HTTP 和 HTTPS 請求都會自動通過代理來訪問了。如果要取消代理設置,可以:
$ unset http_proxy
$ unset https_proxy
還有一點要注意的是,使用 http_proxy 和 https_proxy 只對 HTTP 和 HTTPS 請求有效,所以當你 ping www.google.com 的時候如果 ping 不通的話,也就沒什麼大驚小怪的了。
題外話:如何使用 PAC 文件?
有時候我們會使用 git 訪問不同的 git 倉庫,譬如 GitHub,或者 Git@OSC, 或者你自建的 Git 伺服器,但是只想訪問 GitHub 的時候使用代理,訪問其他的倉庫不要使用代理。這時候我們似乎可以使用 PAC 來解決這個問題。 PAC (代理自動配置)正是用於瀏覽器來根據不同的 URL 自動採用不同的代理的一項技術,該文件包含一個 FindProxyForURL Javascript 函數,用於根據 URL 來返回不同的代理。
但是遺憾的是,目前 git 似乎還不支持 PAC 文件,但我們可以打開 PAC 文件找到代理的地址,然後通過上面的方法來配置或取消配置,只是有些繁瑣。 也許可以寫個腳本來解析 PAC 文件,並將 git 包裝下,來實現自動切換代理,有機會嘗試下。
G. tortoisegit工具 推送代碼要多久
Github是管理軟體開發的首選託管網站,12306的火車票插件一時讓國內當時很多小白開發者(當然也包括我)認識到了這個網站。GitHub可以託管各種git庫,並提供一個web界面,與SourceForge或GoogleCode這樣的服務不同,GitHub的獨特賣點在於從另外一個項目進行分支的簡易性。為一個項目貢獻代碼非常簡單,首先點擊項目站點的「fork」的按鈕,然後將代碼檢出並將修改加入到剛才分出的代碼庫中,最後通過內建的「pullrequest」機制向項目負責人申請代碼合並。下面開始正題:首先需要到TortoiseGit官網下載TortoiseGit,最新的是1.8.11,我從1.8.11-1.8.6下載都不能用,最後下載是1.8.5,我的電腦是Window8。安裝完之後再電腦啟動項會顯示,雙擊Puttygen,生成密鑰,這個是等會再GitHub上面配置的:點擊Generate生成密鑰,生成密鑰的時候,記得滑鼠要移動,不然的話,會卡住,保存私鑰的時候,記得加密碼點擊Saveprivatekey保存一下這個密鑰,位置自選,最好是一個常用位置。到GitHub官網./注冊一個賬號,然後登陸之後,點擊Setting進入設置頁面:這個時候添加SSHKey即可,Title自定義,key就是之前用工具生成的key:新建一個Repository,填寫Repository名稱以及說明。
H. git 在使用拉取、推送(pull或push)時時候會出現這樣的錯誤提示
d:Program Files (x86)Git/libexec/git-coregit-pull:line 268:/bin/tr:Bad file number
Your configuration specifies to merge with the ref 'master' 是不是你的代碼有未提交的更新呀?你修改文件後如果沒有提交push,那麼你在pull的時候就會報錯的,會讓你先提交或者merge合並文件
【拓展資料】
git pull origin 拉取代碼到本地,解決拉取代碼時發生的文件沖突:
1)拉取(下載)指定分支代碼合並到當前分支:
相當於指定分支的代碼與當前分支的代碼合並到了一起。
命令:git pull origin分支名稱
注意:
每次使用該命令前,需要保證本地工作區是沒有任何修改代碼的,也就是說需要將本地工作區編輯過的文件添加到暫存區(git add .),或提交到本地倉庫中(git commit),才可以使用該命令拉取指定分支的代碼合並到當前分支中。
每次在操作完git commit命令後,必須拉取一下master分支代碼,保持本地正在開發功能邏輯的代碼分支代碼是最新的,避免後續在提交時沖突過多或覆蓋掉其他人的代碼的問題出現。
如果我們需要將master主幹分支的代碼拉取並與我們當前分支(xuzhangzheng2)的代碼進行合並的話,可以使用該命令。效果如圖:
中間的======是用於分割本地變更和遠程倉庫中的變更的,也就是說出現沖突時,如圖,使用======把沖突的部分分割成2塊。
上面的是本地修改變更的內容,以<<<<<<<HEAD開頭。
下面的是遠程倉庫修改變更的內容,以>>>>>>>版本號 結尾。
版本號,也就是示例中的,即為提交的版本號,使用該版本號可以在gitlab中找到提交記錄,從而方便查詢其他同事在對同文件進行修改時,都修改了哪些內容,便於進解決沖突。
解決方法:
根據實際業務場景,將本地修改變更的部分和遠程倉庫中修改變更的部分進行合並,留下滿足業務邏輯的代碼即可(若團隊開發期間,出現沖突時,建議找到相關同事進行溝通,確保自己解決沖突的方法不會影響到其他人編寫的功能),同時將上面提到的沖突標識刪除掉,不然無法通過語法檢查和編譯。
同時建議使用全文件內容搜索<<<<<<<或======或>>>>>>>,將所有有沖突的地方一一進行解決,保重提交的代碼是可運行,沒有問題的。
解決沖突後,若需要提交代碼的話,需先將代碼使用git add .存入緩存區,或直接使用git commit –am 「本次提交描述」 或git commit –a –m 「本次提交描述」將代碼提交至本地倉庫區,同時再次拉取制定分支的最新代碼,確保本次的代碼時刻都是最新的,再進行接下來的推送代碼至遠程倉庫操作。
I. 如何向GitHub貢獻代碼
本篇重點介紹Github上如何給別人貢獻代碼,通過這個過程,也可以知道如果一個項目託管到Github上,團隊成員之間合作的流程,給別人貢獻代碼,特別是一些開源組織,是件光榮的事
1、搜索你要貢獻的代碼倉庫,在這里我創建了兩個帳號,一個主帳號,裡面有一個代碼倉庫mfjc,一個是將要貢獻代碼的帳號howard5888,搜索代碼倉庫如下圖:
2、按下回車後,即會出現搜索到的庫,如下圖所示3、點擊上圖中的倉庫鏈接,進入mfjc倉庫,點擊右邊的fork,fork的含義就是創建mfjc項目的副本作為你自已的項目
J. Git 怎樣保證fork出來的project和原project同步更新
1. 在 Fork 的代碼庫中添加上游代碼庫的 remote 源,該操作只需操作一次即可。
如: 其中# upstream 表示上游代碼庫名, 可以任意。
git remote add upstream https://github.scm.corp.ebay.com/montage/frontend-ui-workspace
2. 將本地的修改提交 commit
3. 在每次 Pull Request 前做如下操作,即可實現和上游版本庫的同步。
3.1 : git remote update upstream
3.2 : git rebase upstream/{branch name}
需要注意的是在操作3.2之前,一定要將checkout到{branch name}所指定的branch,
如: git checkout develop
4. Push 代碼到 Github
git push